如何将参数传递给自定义Zend验证器?

时间:2011-02-25 12:51:00

标签: php zend-framework doctrine customvalidator

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

3 个答案:

答案 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));