Zend framework Zend Form Validator回调:如何排除用户名?
我在User Mapper类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',
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表单。。。非常感谢。