我正在通过构建一些供我自己使用的实用程序网站来慢慢建立我的Zend技能.我一直在使用Zend Forms和Form验证,到目前为止我一直很高兴我已经理解了Zend的做事方式.但是我对如何在编辑表单的上下文中使用Zend_Validate_Db_NoRecordExists()以及映射到必须唯一的数据库列的字段感到困惑.
例如,使用这个简单的表
TABLE Test
(
ID INT AUTO_INCREMENT,
Data INT UNIQUE
);
Run Code Online (Sandbox Code Playgroud)
如果我只是在Table Test中添加一个新行,我可以在Data字段的Zend Form元素中添加一个验证器:
$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data') )
Run Code Online (Sandbox Code Playgroud)
在表单验证时,此验证程序将检查表中是否已存在Data元素的内容.因此,插入Test可以继续而不违反数据字段UNIQUE限定符.
但是,编辑Test表的现有行时情况会有所不同.在这种情况下,验证器需要检查元素值是否满足两个互斥条件条件之一:
用户已更改元素值,表中当前不存在新值.
用户未更改元素值.因此,该值不当前存在的表(这是确定).
在Zend的验证文档谈论加入一个参数到NoRecordExists()验证从验证过程不包括记录的目的.想法是"验证表格以查找任何匹配的行,但忽略a字段具有此特定值的任何命中".这样的用例是在编辑表时验证元素所需的用例.在1.9中执行此操作的伪代码就是这样(实际上我从1.9源代码中得到了这个 - 我认为当前的文档可能是错误的):
$data = new Zend_Form_Element_Text('Data');
$data->addValidator( new Zend_Validate_Db_NoRecordExists('Test', 'Data',
array ('field'=>'Data', 'Value'=> $Value) );
Run Code Online (Sandbox Code Playgroud)
问题是要被排除的值($ Value)在实例化时被绑定到验证器(也就是在实例化表单时).但是当表单正在编辑记录时,当表单最初填充数据时,该值需要绑定到$ data字段的内容 - IE最初从Test表行读取Data值.但是在典型的Zend模式中,表单被实例化并在两个单独的步骤中填充,这排除了将排除值绑定到期望的元素值.
下面的Zend伪代码标记了我想要将$ Value绑定到NoRecordExists()验证器的位置(并注意这是一个常见的Zend控制器模式):
$form = new Form()
if (is Post) {
$formData = GetPostData()
if ($form->isValid($formData)) {
Update Table with $formData
Redirect out of here …Run Code Online (Sandbox Code Playgroud) 我正在构建一个ZendFramework应用程序,它作为一个登录表单,要求提供电子邮件地址和密码 - 在使用登录尝试访问数据库之前验证电子邮件地址似乎是有意义的,因为无效的电子邮件永远不会导致有效命中.Zend_Validate_EmailAddress似乎是正确的方法,但我遇到了生成多个错误的问题(在底部的问题,在代码之后).
我的表格目前有以下内容
//WPMail_Form_Login::init()
$email = $this->addElement('text', 'email', array(
'label'=>'Email',
'required'=>true,
'filters'=>array('stringtrim'),
'validators'=>array(array('emailaddress', true, array(
'messages'=>array(
'emailAddressInvalidHostname'=>'Your email address is invalid',
'emailAddressInvalidFormat'=>'Your email address is invalid',
'...'=>'(repeat for all message templates)'
)
))),
));
Run Code Online (Sandbox Code Playgroud)
在控制器中我直接将表单传递给视图:
// WPMail_AuthController::loginAction()
$this->view->form = $form;
Run Code Online (Sandbox Code Playgroud)
在视图中,它直接回应:
// views/scripts/auth/login.phtml
<?php echo $this->form ?>
Run Code Online (Sandbox Code Playgroud)
结果目前是这样的:
- Your email address is invalid
- 'asda!!!' does not match the expected structure for a DNS hostname
- 'asda!!!' does not appear to be a valid local network name
Run Code Online (Sandbox Code Playgroud)
我想要知道的是:是否可以配置Zend …
我正在尝试为Db_NoRecordExists验证器使用"exclude"选项,因为当我"编辑"该元素时,它总是像往常一样将我返回"重复"错误.
我的目的是告诉表单保留从Controller传递给表单本身的值...
这是控制器:
public function editAction()
{
$id = $this->getRequest()->getParam('id');
$pagesMapper = new Application_Model_PagesMapper();
$form = new Application_Form_PageEdit();
$form->populate($pagesMapper->fetchId($id, true));
if ($this->getRequest()->isPost()) {
if ($form->isValid($this->getRequest()->getPost())) {
//... cut ...
}
}
$this->view->form = $form;
}
Run Code Online (Sandbox Code Playgroud)
这是表格:
class Application_Form_PageEdit extends Zend_Form
{
public function init()
{
$commonFilters = array('StringTrim');
$commonValidators = array('NotEmpty');
$this->setMethod('post')->setAction('/admin-page/edit');
$id = new Zend_Form_Element_Hidden('id');
$pid = new Zend_Form_Element_Hidden('pid');
$keyname = new Zend_Form_Element_Text('keyname');
$keyname->setLabel('Keyname')
->setRequired(true)
->addFilters($commonFilters)
->addFilter('StringToLower')
->addFilter('Word_SeparatorToDash')
->addValidator('Db_NoRecordExists', false, array(
'table' => 'pages',
'field' => 'keyname',
'exclude' => …Run Code Online (Sandbox Code Playgroud) 我试图让这个Zend Validator输出一个转到resetpass表单的链接.目前,它只是将HTML作为文本输出.有关如何将其作为HTML写入页面的任何想法?
谢谢!
这是我的代码:
protected $_authAdapter;
protected $_messageTemplates = array(
self::NOT_UNIQUE => 'This email has already been registered! <a href=\'/user/resetpass/\'>Need to reset your password?</a>'
);
public function isValid($value, $context=null)
{
$value = (string) $value;
$users = new Users(array('db' => 'tdb'));
if($users->userExists($value)){
$this->_error(self::NOT_UNIQUE);
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个元素.我想为它添加自定义验证器和自定义过滤器.验证器确保输入是几个允许值之一,然后过滤器将一些自定义值添加到输入.这意味着我必须在运行过滤器之前先验证原始输入.我是按照这个顺序做的
$element = new Zend_Form_Element_Text('element');
$element->addValidator('PermittedValue', false);
$element->addFilter('TotalHyphen', false);
$this->addElement($element);
Run Code Online (Sandbox Code Playgroud)
但这个顺序没有得到尊重.过滤器首先运行并更改数据,然后验证器在过滤的数据上运行,这意味着即使对于有效输入它也总是失败.从文档中可以看出这是故意的
注意:验证在过滤值上运行Zend_Form_Element :: isValid()在验证之前通过提供的过滤器链过滤值.有关更多信息,请参阅过滤器部分.
如何指定验证器和过滤器的运行顺序?
我在我的表单中使用zend验证,我无法验证表单中的多选框.
这是我在表单中的多选元素:
$days = new Zend_Form_Element_Select('day');
$days->setLabel('Days')
->addMultiOptions($total_days)
->setRequired(true)
->addValidator('NotEmpty')
->setAttrib('multiple', 'multiple');
Run Code Online (Sandbox Code Playgroud)
在表单提交过程中,我收到以下错误,即使我在多选框中选择了一些选项:
在大海捞针中找不到阵列
我在Zend/Validate/InArray.php中看到以下代码,它只能验证单个表单元素,但不能验证数组:
public function isValid($value)
{
$this->_setValue($value);
if (in_array($value, $this->_haystack, $this->_strict))
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我该如何解决这个错误呢?
谁帮我为Zend Framework创建了一个自定义验证器,它可以检查日期是否在一个范围内?
例:
dateGT = 2011-09-05
dateLT = 2011-07-05
Run Code Online (Sandbox Code Playgroud)
如果表单字段设置为:dateFieldForm = 2011-08-15我希望验证器返回true!
如果表单字段设置为:dateFieldForm = 2011-10-15我希望验证器返回false!
中Zend_Validate_EmailAddress和filter_var(..., FILTER_VALIDATE_EMAIL),从而验证电子邮件地址和为什么当是更好?
php zend-framework email-validation zend-validate filter-var
今天我更新到ZF 2.4使用浮动验证器但不幸的是我意识到我的文件上传表单字段给出了意外的错误消息.
这是我的表单对象
$this->add([
'name' => 'profileimage',
'type' => '\Zend\Form\Element\File',
'attributes' => [
'id' => 'profileimage',
'class' => 'styled',
],
]
);
Run Code Online (Sandbox Code Playgroud)
这是我的验证器
$inputFilter->add([
'name' => 'profileimage',
'required' => false,
'allow_empty' => true,
'priority' => 300,
'filters' => [
['name' => 'StripTags'],
['name' => 'StringTrim'],
],
'validators' => [
[
'name' => '\Zend\Validator\File\IsImage',
],
[
'name' => '\Zend\Validator\File\UploadFile',
],
[
'name' => '\Zend\Validator\File\ImageSize',
'options' => [
'minWidth' => 300,
'minHeight' => 300,
]
],
[
'name' => '\Zend\Validator\File\Size',
'options' => …Run Code Online (Sandbox Code Playgroud) zend-framework zend-form zend-validate zend-file zend-framework2
我在Zend表单中面临一个关于电子邮件验证的小问题.
$emailId = new Zend_Form_Element_Text('email');
$emailId->setLabel("Email Adresse")
->addFilter('StripTags')
->addFilter('StringTrim')
->addValidator(new Validator_EmailValidator())
->addValidator('NotEmpty')
->addValidator(
'NotEmpty',
TRUE,
array('messages' => array(
'isEmpty' => 'Please enter your email id.'
)
)
);
Run Code Online (Sandbox Code Playgroud)
目前,它将电子邮件错误消息显示为:

我想要的是在所有这些错误的位置设置单个错误消息,如下所示:
"'abcd @ shdsjah'不是有效的电子邮件ID."
由于我是Zend Framework的新手,我对它并不太了解,虽然我尝试了一些代码,但它们没用.
请帮忙.....
提前致谢....
zend-framework ×10
zend-validate ×10
php ×7
zend-form ×7
date ×1
filter-var ×1
zend-db ×1
zend-file ×1
zend-filter ×1