Zend Framework 2使用经过验证的值重新填充表单

时间:2016-01-30 03:47:28

标签: php forms validation zend-framework2

我有一个简单的表单类设置和一个过滤器。提交表单后,如果出现验证错误,验证/过滤器可以正常工作,我可以转储过滤后的值,但表单不会显示已清理的数据。特别是,我正在使用StringTrim和StripTags进行测试。我可以看到修剪后的值,但最终的表格输出仍然显示提交的原始值。在重新填充表单时,如何使用经过验证的值?

一个例子:
表单数据提交字符串“asdf”。

转储表单数据,$ regform-> getData():“asdf”

以上是预期的,但视图中的输出仍显示空格:“asdf”。

我感谢任何意见。代码如下。谢谢!

控制器代码:

public function indexAction ()
{
    $this->layout()->pageTitle = "Account Registration";
    $regform = new RegForm($data=null);
    if($this->request->isPost()){
        $data = $this->post;
        $regform->setData($data);
        $ufilter = new RegFilter();
        $regform->setInputFilter($ufilter->getInputFilter());
        if($regform->isValid()){
            $this->view->result = "ok";
        }
        else {
            $this->view->result = "Not good";
        }
        var_dump($regform->getData());
    }
    $this->view->regform = $regform;
    return $this->view;
}

RegForm.php

<?php
namespace GWMvc\Form;
use Zend\Form\Form;
use Zend\Form\Element;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Session\Container;
class RegForm extends Form
{
    public function __construct($data = null, $args = array())
    {
        parent::__construct('reg-form');
        $this->setAttribute('class', 'form form-inline');
        $this->setAttribute('role', 'form');
        $this->setAttribute('method', 'post');
        $this->setAttribute('action','/app/registration/index');

        $this->add(array(
            'name' => 'firstname',
            'type' => 'Zend\Form\Element\Text',

            'options' => array(
                'label' => 'First Name:',

            ),
            'attributes' => array('id' => 'firstname', 'type' => 'text',
                'class' => 'regformitem regtextfield')));

        $this->add(array(
            'name' => 'lastname',
            'type' => 'Zend\Form\Element\Text',
            'options' => array(
                'label' => 'Last Name:'
            ),
            'attributes' => array('id' => 'lastname', 'type' => 'text',
                'required' => true,'class' => 'regformitem regtextfield')));

        $this->add(array(
             'type' => 'Zend\Form\Element\Csrf',
             'name' => 'csrf',
             'options' => array(
                     'csrf_options' => array(
                             'timeout' => 600
                     )
             )
         ));

        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Submit',
                'class' => 'btn btn-default',
            ),
        ));
    }
}

RegFilter.php

<?php
namespace GWMvc\Form;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
class RegFilter implements InputFilterAwareInterface
{
    public $username;
    public $password;
    protected $inputFilter;
    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new \Exception("Not used");
    }
    public function getInputFilter()
    {
        if (!$this->inputFilter) {
            $this->inputFilter = new InputFilter();
            $this->factory     = new InputFactory();

            $this->inputFilter->add($this->factory->createInput(array(
                'name'     => 'firstname',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StringTrim'),
                    array('name' => 'StripTags'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 50,
                        ),
                    ),
                ),
            )));
            $this->inputFilter->add($this->factory->createInput(array(
                'name'     => 'lastname',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'    => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 50,
                        ),
                    ),
                ),
            )));
        }
        return $this->inputFilter;
    }
}  

查看脚本:

<?php
    $form = &$this->regform;
    $form->prepare();
    echo $this->form()->openTag($form);
    echo $this->formElement($form->get('csrf'));?>
    <div class="form" gwc="regitem">
    <?php echo $this->formRow($form->get('firstname')); ?>
    </div>
    <div class="form" gwc="regitem">
    <?php echo $this->formRow($form->get('lastname')); ?>
    </div>

编辑(解决方案) 根据下面接受的答案,这很容易。这是我添加的内容。

$valid = $regform->isValid();
$regform->setData($regform->getData());
if($valid){
    $this->view->result = "ok";
} else {
    // not ok, show form again
}

1 个答案:

答案 0 :(得分:1)

我想你必须手动完成:

if($regform->isValid()){
    $regform->setData ($regform->getData ())->isValid ();
    $this->view->result = "ok";
}