使用 ZF2,我编写了一个自定义表单元素并将其包含在一堆表单中。问题是,如果我指定我不希望 form 元素是必需的,我将丢失该元素的默认验证器。
class MyForm extends Zend\Form\Form implements Zend\InputFilter\InputFilterProviderInterface
{
public function __construct()
{
parent::__construct("my-form");
$this
->add(array(
'type' => 'Me\Custom\EmailList',
'name' => 'emails',
'options' => array(
'label' => _t('Email List'),
),
));
}
public function getInputFilterSpecification()
{
return array(
'emails' => array(
'required' => false,
),
));
}
}
“EmailList”元素是一个简单的文本字段,接受以逗号分隔的电子邮件地址列表。
class EmailList extends \Zend\Form\Element\Email
{
protected $attributes = array(
'type' => 'email',
'multiple' => true,
);
public function getInputSpecification()
{
$this->getEmailValidator()
->setMessage('"%value%" is not a valid email address');
$validator = $this->getValidator();
if ($validator instanceof ExplodeValidator) {
$validator->setValueDelimiter(', ');
}
return array(
'name' => $this->getName(),
'required' => true,
'validators' => array(
$validator,
),
);
}
}
因此,在我的 MyForm 类中,似乎通过在 getInputSpecification()
中包含“电子邮件”,EmailList 上的默认验证器被完全清除并且从未使用过。
如何将必需的标志设置为 false 并维护元素的默认验证器?
请注意,此自定义字段用于大量表单中,并且大部分时间都是必需的,这就是为什么其默认规范包括将必需标志设置为 true 的原因。
谢谢
最佳答案
所以您希望电子邮件字段是可选的,但如果填充,它会使用您的验证器?
假设我已正确理解该问题,您的代码对我来说工作正常(在 ZF 2.2.5 上),只需一个非常小的更改:
class EmailList extends \Zend\Form\Element\Email
{
protected $attributes = array(
'type' => 'text', // <- I changed type from 'email' to 'text'
'multiple' => true,
);
[...]
HTML type="email"
是 HTML5 中添加的字段类型之一,并且(至少在 Webkit 浏览器中)这会触发浏览器本身的一些客户端验证。浏览器会对这种类型的字段做的一件事是删除所有空格。然后您的表单无法验证,因为您希望 ,
(逗号空格)作为分隔符。通过将类型更改为 text
,浏览器会将其视为普通的旧文本字段,ZF 将处理所有服务器端验证。
如果这是问题所在,您可能会发现将值分隔符设置为 ,
(或根本不设置)也可以解决问题。
如果这不能解决问题,请验证应用是否进入 if ($validator instanceof ExplodeValidator) {
条件。您还可以尝试使用以下方法查看附加到 Controller 表单元素的验证器:
var_dump($form->getInputFilter()->get('emails')->getValidatorChain());
关于php - 在不丢失元素的默认输入过滤器规范的情况下不需要 zend2 设置字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894514/