【问题标题】:Zend Framework 2 Setting Zend\InputFilter setRequired()Zend Framework 2 设置 Zend\InputFilter setRequired()
【发布时间】:2013-01-30 16:58:17
【问题描述】:

我有一个带有 InputFilter 的 Form\Element,其 'required' 值设置为“false”。在某些情况下,该元素需要在控制器中将“必需”值设置为“真”。

当我在我的控制器中设置 Zend\InputFilter setRequired(true) 时,调用 $form->isValid() 方法时似乎没有得到尊重。但是,如果在 Zend\InputFilter 中将过滤器设置为“必需”为“真”(而不是在控制器内部动态设置),那么它会按预期工作 - 但这不是我想要的解决方案,因为我使用此表单并过滤了几个位置,有时需要该字段,有时则不需要。

在我的控制器中,我有以下内容:

$form = new UserDataForm();
$request = $this->getRequest();

if ($request->isPost()) {
    $update = new UserFilter();
    // The following doesn't seem to be respected
    $update->getInputFilter()->get('userName')->setRequired(true);

    $form->setInputFilter($update->getInputFilter());
    $form->setData($request->getPost());

    if($form->isValid()) {
        //The result is true even when the 'userName' var is not set in the POST data.
        echo("Is Valid");
    } else {
        echo($form->getMessages());
    }

我已经像这样设置了我的 UserDataForm() 类:

class UserDataForm extends Form
{
public function __construct($name = null, array $userTypes) {
    parent::__construct('user');
    $this->setAttribute('method','post');

    $this->add(array(
        'name' => 'userName',
        'attributes' => array(
            'type' => 'text',
            'class'=> 'small'
        ),
        'options' => array(
            'label' => 'Username:'
        )
    ));

    //... and so on...

我已经像这样设置了我的 UserFilter 类:

public function getInputFilter() {
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();
        $factory     = new InputFactory();

        $inputFilter->add($factory->createInput(array(
            'name'      => 'userName',
            'required'  => false,
            'filters'   => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'  => 'StringLength',
                    'options'  => array(
                        'encoding'  => 'UTF-8',
                    )
                ),
            )
        )));

    // ...

有人可以解释为什么在验证表单时似乎不尊重从我的控制器调用的 $update->getInputFilter()->get('userName')->setRequired(true) 吗?

【问题讨论】:

    标签: zend-framework2


    【解决方案1】:

    我在上面休息了一段时间后发现了问题。 显然, ->setRequired(true) 在动态分配时是互斥的。如果您正在寻找与从 \FilterInput 设置 'required' => true 相同的行为,则还需要添加 ->setAllowEmpty(false)。

    所以我修改后的代码现在看起来像这样:

    $update->getInputFilter()->get('userName')->setRequired(true);
    $update->getInputFilter()->get('userName')->setAllowEmpty(false);
    

    井架

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多