0

我正在尝试在 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;
4

3 回答 3

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.
}
于 2011-02-25T14:37:39.930 回答
2

我认为要new Generic_ValidateUniqueAdGroupName($campaign_id)完成工作,您需要为 Generic_ValidateUniqueAdGroupName 类和一个名为 $_campaign_id 的变量定义一个构造函数。草稿如下:

class  Generic_ValidateUniqueAdGroupName extends Zend_Validate_Abstract {

   protected $_campaign_id;

   public function __construct($campaign_id) {
      $this->_campaign_id = $campaign_id;
   }

}

有了这个,您将在查询中访问 id 作为$this->_campaign_id.

于 2011-02-25T13:48:13.437 回答
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));
于 2011-02-25T12:58:44.363 回答