簡體   English   中英

Zend Framework 2使用經過驗證的值重新填充表單

[英]Zend Framework 2 Repopulate form using validated values

我有一個簡單的表單類設置以及一個過濾器。 提交表單后,如果出現驗證錯誤,則驗證/過濾器可以工作,並且我可以轉儲過濾后的值,但是該窗體不顯示已清理的數據。 特別是,我正在測試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
}

我想您必須手動執行此操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM