Zend Form Validator回调:如何排除用户名?

时间:2012-02-28 13:15:36

标签: zend-framework zend-form

我在User Mapper类userExist($username)中编写了一个函数return true,如果我的数据库表中不存在相同的用户名。现在我想在Add_User_Form类中使用此函数,该类扩展了Zend_Form。

我想用:

$username = $this->createElement('text','username');
$username->setLabel('Username:')
         ->addValidator('Callback', true, array('callback'=>userExist???));

我可以使用mapper class userExist($username)函数作为回调函数吗? 如果我的实施有问题,请告诉我。我只想在用户已注册时显示错误消息并阻止表单提交。

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用标准验证器,而不是使用回调验证器:

$element->addValidator('Db_NoRecordExists', true, array('users', 'username'))

Db_NoRecordExists允许您检查数据库的特定表中是否存在记录。

如果用户想要编辑他的个人资料,您可能需要检查记录是否存在除了自身。然后你应该使用相同的验证器:

$where = array('users', 'username', array('field' => 'username', 'value' => $username));
$element->addValidator('Db_NoRecordExists', true, $where)

在这些示例中,users是数据库表的名称。 username是您的列名,$username是您要排除的用户名。

答案 1 :(得分:1)

迟到但这可能是你问题的可能答案。

日期元素示例:

我创建了一个带有自定义Callback验证器的日期元素,该验证器调用同一表单类中的方法。

// Date picker from
$datePickerFrom = new Zend_Form_Element_Text('date_picker_from_date');
$datePickerFrom->setRequired(true)
    ->setDecorators($this->elementDecorators)
    ->setLabel('Valid From')
    ->addFilter('StripTags')
    ->addFilter('StringTrim')
    ->setValue(date("d/m/Y",strtotime(Zend_Date::now())))
    ->addValidator('Callback',true, array('callback' => array($this, 'dateCheck'));
$datePickerFrom->getValidator('Callback')->setMessage("'%value%' Cannot be in the past.");
$this->addElement($datePickerFrom);

如果你有自己的类,其中包含自定义验证器,那么你可以这样做:

$myValidatorClass = new \SomeValidaotrClass();
->addValidator('Callback',true, array('callback' => array($myValidatorClass, 'dateCheck'));

在同一个表单类中,我创建了自定义验证方法:

public function dateCheck($value, $elements, $option)
{
    $now = new DateTime();
    $fromDate = new DateTime(str_replace('/', '-', $elements['date_picker_from_date']));        

    if ($fromDate < $now) {
        $this->getElement('date_picker_from_date')->getValidator('Callback')->setMessage("'%value%' Cannot be in the past.");
        return false;
    } else (SomethingElse) {
           $this->getElement('date_picker_from_date')->getValidator('Callback')->setMessage("Some other message.");
    }

    return true;
}

或者如果您使用自己的班级:

class SomeValidaotrClass
{
    public function dateCheck($value, $elements, $option)
    {
        // Validation code...
    }
}

如果方法不是public,则回拨将无法找到它们。