php - 在不丢失元素的默认输入过滤器规范的情况下不需要 zend2 设置字段

标签 php zend-framework zend-framework2

使用 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/

相关文章:

php - codeigniter 对子文件夹内的所有内容返回 404

javascript - 如何使用 ID 循环 JavaScript 函数?

php - Zend 框架 - 不在数据库中输入值 - 垃圾进入

php - 如何从数据库中获取日期并显示而不重复?

php - Zend Framework 1 与 Zend Framework 2 性能对比

mysql - 使用 Zend Framework 2 中的多个 SubSelect 生成查询

php - 使用 ZF2 通过 Doctrine 查询时无法识别的字段 : user_name,

php - 当有两个请求时,处理有限的类(class)名额

javascript - 如何在加载后运行 AJAX 加载的页面脚本

php - 映射 PHP 和 Flex 对象