2011-11-07 59 views
2

我有一個有單個文本字段(公司)的一種形式:如何創建一個依賴Zend_Form的多個值的驗證器?

class Cas_Form_Company extends Zend_Form 
{ 

    public function init() 
    { 
     $this->addElement('hidden', 'id'); 
     $this->addElement('text', 'name', array('label' => 'Name')); 
     $this->addElement('submit', 'submit', array('label' => 'Create')); 

     $name = $this->getElement('name'); 
     $name->addValidator('stringLength', false, array(2,45)); 
     $name->addValidator(new Cas_Model_Validate_CompanyUnique()); 

     $this->setMethod('post'); 
     $this->setAction(Zend_Controller_Front::getInstance()->getBaseUrl() . '/Company/Submit'); 
    } 

    public function SetFromExistingCompany(Cas_Model_Company $company) 
    { 
     $this->getElement('id')->setValue($company->GetId()); 
     $this->getElement('name')->setValue($company->GetName()); 
     $this->getElement('submit')->setLabel('Edit'); 
     $this->addElement('submit', 'delete', array('label' => 'Delete', 'value' => 'delete')); 
    } 

    public function Commit() 
    { 
     if (!$this->valid()) 
     { 
      throw new Exception('Company form is not valid.'); 
     } 

     $data = $this->getValues(); 
     if (empty($data['id'])) 
     { 
      Cas_Model_Gateway_Company::FindOrCreateByName($data['name']); 
     } 
     else 
     { 
      $company = Cas_Model_Gateway_Company::FindById((int)$data['id']); 
      $company->SetName($data['name']); 
      Cas_Model_Gateway_Company::Commit($company); 
     } 
    } 
} 

我還創建了一個小驗證器強制執行,我想公司有唯一的名字:

class Cas_Model_Validate_CompanyUnique extends Zend_Validate_Abstract 
{ 
    protected $_messageTemplates = array(
     'exists' => '\'%value%\' is already a company.' 
    ); 

    /** 
    * @param string $value 
    * @return bool 
    */ 
    public function isValid($value) 
    { 
     $this->_setValue($value); 
     $company = Cas_Model_Gateway_Company::FindByName($value); 
     if ($company) 
     { 
      $this->_error('exists'); 
      return false; 
     } 

     return true; 
    } 
} 

現在,這適用於創建新公司。當我想允許編輯公司時,問題就出現了。這是因爲對於編輯操作,雖然公司名稱必須是唯一的,但包含已經與給定ID相關的名稱的表單根本不是編輯(因此是有效的)。也就是說,如果名稱不存在於數據庫中,或者所給的名稱與已分配給該ID的名稱相匹配,則表單有效。

但是,將其作爲驗證程序編寫似乎有問題,因爲驗證程序僅獲取正在處理的值 - 而不是所討論的ID。

如何爲這類事情寫一個驗證器?

+0

[Zend驗證郵政編碼在Zend表格中 - >驗證取決於給定的國家]可能重複(http://stackoverflow.com/questions/5992569/zend-validate-postcode-in-a-zend-form-validate依賴於給定國家) – Phil

回答

相關問題