我正在尝试在Zend框架中编写验证器。
验证程序查询数据库以检查是否存在特定记录,此查询使用where子句。 where子句的值由表单上的另一个字段指定,那么如何将此值传递给验证器?
这是我添加验证器的方式:
$adgroup_name->addValidator(new Generic_ValidateUniqueAdGroupName() ); break;
在我的验证器中,我有:
// Query which gets an array of existing ad group names in db
$q = Doctrine_Query::create()
->select('a.name')
->from('AdGroup a')
->where('a.name = ?', $value)
->andWhere('a.campaign_id = ?', $campaign_id);
$adgroup_names_result = $q->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
如何传入$ campaign_id?我尝试了以下内容,但它不起作用:
$adgroup_name->addValidator(new Generic_ValidateUniqueAdGroupName($campaign_id) ); break;
答案 0 :(得分:4)
原理与“确认密码”验证器中使用的原理相同。提交表单时,您需要字段中表单中另一个元素的值。这就是为什么尝试使用campaign_id实例化验证器不起作用:$campaign_id
的值尚未设置。
当一个元素在其验证器上调用isValid()
时,它会传递一个名为$context
的第二个参数,该参数填充了一组提交的表单值。因此,验证程序中的isValid()
方法应如下所示:
public function isValid($value, $context = null)
{
$campaign_id = $context['campaign_id'];
// Now build your query using $value - from the element to which this
// validator is attached - and the $campaign_id provided by the context.
// And, of course, return true/false as required.
}
答案 1 :(得分:2)
我认为要使new Generic_ValidateUniqueAdGroupName($campaign_id)
工作,你需要为Generic_ValidateUniqueAdGroupName类和一个名为eg的变量定义一个构造函数。 $ _campaign_id。草案如下:
class Generic_ValidateUniqueAdGroupName extends Zend_Validate_Abstract {
protected $_campaign_id;
public function __construct($campaign_id) {
$this->_campaign_id = $campaign_id;
}
}
通过此操作,您可以在$this->_campaign_id
中查询查询中的ID。
答案 2 :(得分:0)
您需要提供$options
参数:
Zend_Form_Element中的实施:
public function addValidator($validator, $breakChainOnFailure = false, $options = array())
所以,你会做这样的事情:
$validator = new new Generic_ValidateUniqueAdGroupName();
$adgroup_name
->addValidator($validator, false, array('campaign_id' => 1));