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

Zend framework Zend Form Validator回调:如何排除用户名?,zend-framework,zend-form,Zend Framework,Zend Form,我在User Mapper类userExist($username)中编写了一个函数,如果我的数据库表中不存在相同的用户名,该函数将返回true。现在我想在Add_User_Form类中使用这个函数,它扩展了Zend_Form 我想使用: $username = $this->createElement('text','username'); $username->setLabel('Username:') ->addValidator('Callback',

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

我想使用:

$username = $this->createElement('text','username');
$username->setLabel('Username:')
         ->addValidator('Callback', true, array('callback'=>userExist???));
我可以使用映射器类
userExist($username)
函数作为回调函数吗? 如果我的实现有问题,请告诉我。我只想在用户已经注册并阻止表单提交时显示错误消息


谢谢。

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

$element->addValidator('Db_NoRecordExists', true, array('users', 'username'))
允许您检查数据库的特定表中是否存在记录

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

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

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

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

$element->addValidator('Db_NoRecordExists', true, array('users', 'username'))
允许您检查数据库的特定表中是否存在记录

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

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

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

有点晚,但这可能是您问题的答案

日期元素示例:

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

// 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;
}

如果方法不是
公共的
,回调将找不到它们。

有点晚,但这可能是您问题的答案

日期元素示例:

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

// 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;
}

如果这些方法不是
public
的,回调将找不到它们。

Hey@Liyali我在扩展zend form abstract的类中。如何获得$username的值?对不起,如果你问了一个愚蠢的问题,你是什么意思?我猜你说的是Zend_表单
$username
只是当前用户的用户名,您可以使用其构造函数将其传递给表单。请注意,如果您只是尝试检查是否存在用户,则不需要使用此选项。请参阅我正在添加新用户确定。我只在($form->isValid($request->getPost())都由这个isValid方法处理时使用。那个么我怎样才能得到输入的用户名值呢。如果要添加新用户,可以使用$this->getValue('username')获得它吗?
$element->addValidator('Db_NoRecordExists',true,array('users','username'))
足以满足您的需要。您只需要将这一行添加到username元素中,并将“users”更改为表名,“username”更改为列名。我收到错误消息“找到了一条与‘rajan_123’匹配的记录”。非常感谢。我还有一个问题。在添加新用户时,我们创建的所有表单字段都是空的,但如果我想编辑现有记录并使用表单值加载表单,该怎么办?因为在此之前我使用的是HTML表单,而不是zend表单。。。谢谢。嘿@Liyali我在扩展zend form abstract的类中。如何获得$username的值?对不起,如果你问了一个愚蠢的问题,你是什么意思?我猜你说的是Zend_表单
$username
只是当前用户的用户名,您可以使用其构造函数将其传递给表单。请注意,如果您只是尝试检查是否存在用户,则不需要使用此选项。请参阅我正在添加新用户确定。我只在($form->isValid($request->getPost())都由这个isValid方法处理时使用。那个么我怎样才能得到输入的用户名值呢。如果要添加新用户,可以使用$this->getValue('username')获得它吗?
$element->addValidator('Db_NoRecordExists',true,array('users','username'))
足以满足您的需要。您只需要将这一行添加到username元素中,并将“users”更改为表名,“username”更改为列名。我收到错误消息“找到了一条与‘rajan_123’匹配的记录”。非常感谢。我还有一个问题。在添加新用户时,我们创建的所有表单字段都是空的,但如果我想编辑现有记录并使用表单值加载表单,该怎么办?因为在此之前我使用的是HTML表单,而不是zend表单。。。非常感谢。