如何修改zend Db_RecordExists验证器where子句?

时间:2012-03-02 07:23:32

标签: zend-framework zend-form zend-form-element zend-validate

我想在where子句中添加多个值的检查。 Db_RecordExists只检查一个字段。我已经读过你可以扩展zend验证抽象类,你可以拥有自己的验证器。请问我可以举一个小例子。

谢谢...

2 个答案:

答案 0 :(得分:4)

你准备做什么?对我来说,你甚至不需要自定义验证器。

如果您仔细阅读Zend_Validate_Db_Abstract的源代码,您会注意到构造函数上方的phpDoc:

  

提供与Zend_Validate_Db验证器一起使用的基本配置   设置$ exclude允许从匹配中排除单个记录。   Exclude可以是包含where子句的String,也可以是包含fieldvalue键的数组   定义添加到sql的where子句。   可以选择提供数据库适配器以避免使用已注册的默认适配器。

     

支持以下选项键:

     
      
  1. 'table'=>要验证的数据库表
  2.   
  3. 'schema'=>架构键
  4.   
  5. 'field'=>用于检查匹配的字段
  6.   
  7. 'exclude'=>要从查询中排除的可选where子句或字段/值对
  8.   
  9. 'adapter'=>要使用的可选数据库适配器
  10.   

这意味着如果要检查记录是否存在使用多个值,只需在将where子句传递给验证器而不是对字段/值:< / p>

$where = 'user_id != 110 AND email != "email@example.com"';
$where = array('users', 'email', $where);

$element->addValidator('db_NoRecordExists', true, $where)

这将基本检查用户表中是否存在记录,并排除用户ID!= 110 email@example.com EM>。当然,我建议您使用quoteIdentifier(),例如{{1}},以生成完全转义的查询表达式。

您可以根据需要添加任意数量的字段。

您可以找到Zend_Db methods

答案 1 :(得分:1)

您通常要做的就是覆盖isValid()方法来制作自定义验证器,这是自定义验证器的示例:

<?php

class My_Validator_Usphone extends Zend_Validate_Abstract {
    const PHONE = 'phone';

    protected $_messageTemplates = array(
        self::PHONE => "'%value%' is not a valid U.S. phone number.
            Phone number must be entered in (xxx)xxx-xxxx or xxx-xxx-xxxx format."
    );

    public function isValid($value) {
        $this->_setValue($value);

        $isValid = TRUE;
        $pattern = ('/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/');
        if (!preg_match($pattern, $value)) {
            $this->_error(self::PHONE);
            $isValid = FALSE;
        }
        return $isValid;
    }

}

Db_RecordExists非常简单但扩展Zend_Validate_Db_Abstract并且应该很容易修改以验证两个字段,但您可能必须覆盖isValid()getSelect()或{{1}接受多个值。

_query()