gpt4 book ai didi

zend-framework - 如何创建一个依赖于多个 Zend_Form 值的验证器?

转载 作者:行者123 更新时间:2023-12-03 22:43:00 24 4
gpt4 key购买 nike

我有一个只有一个文本字段(针对公司)的表单:

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。

如何为这类事情编写验证器?

最佳答案

您可以将记录不完整的第二个 $context 参数用于 isValid()

参见 http://framework.zend.com/manual/en/zend.form.elements.html#zend.form.elements.validators并向下滚动到注释“验证上下文”

关于zend-framework - 如何创建一个依赖于多个 Zend_Form 值的验证器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8033267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com