【问题标题】:How to pass in a parameter to a custom Zend validator?如何将参数传递给自定义 Zend 验证器?
【发布时间】:2011-02-25 12:50:59
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个版本的 Zend Framework?

标签: php zend-framework doctrine customvalidator


【解决方案1】:

原理与“确认密码”验证器中使用的相同。您需要在提交表单时在字段中获取表单中另一个元素的值。这就是为什么尝试使用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.
}

【讨论】:

  • 感谢大卫的解释。有道理,但是我尝试过这种方法,但在尝试使用 $context 数组时出现错误;致命错误:Generic_ValidateUniqueAdGroupName::isValid() 的声明必须与 Zend_Validate_Interface::isValid() 的声明兼容
  • 通过使用 public function isValid($value, $context = null) 你应该没有错误,因为 $context 参数在定义中是可选的,所以它符合接口声明
  • 现在修改我的答案。很抱歉遗漏了。 @Jeff:感谢您的帮助。
  • 我的荣幸。很高兴它有帮助。干杯!
【解决方案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;
   }

}

这样,您将在查询中以$this->_campaign_id 的形式访问 id。

【讨论】:

  • 别忘了调用父构造函数!
  • @Denis 'Alpheus' Čahuk。 Zend_Validate_Abstract 没有构造函数。
  • 这是特定于实现的,您不应依赖该信息。
  • @Denis 'Alpheus' Čahuk。如何调用父构造函数?
  • @Sid。父构造函数是什么? Zend_Validate_Abstract 没有构造函数 (github.com/mridgway/Zend-Framework-1.x-Mirror/blob/1.11.3/…)
【解决方案3】:

您需要提供$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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2018-08-20
    • 2017-01-06
    • 2022-11-09
    • 1970-01-01
    相关资源
    最近更新 更多