我有一個有單個文本字段(公司)的一種形式:如何創建一個依賴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。
如何爲這類事情寫一個驗證器?
[Zend驗證郵政編碼在Zend表格中 - >驗證取決於給定的國家]可能重複(http://stackoverflow.com/questions/5992569/zend-validate-postcode-in-a-zend-form-validate依賴於給定國家) – Phil