簡體   English   中英

Zend框架2 - 在提交錯誤表單時使表單字段變粘

[英]Zend framework 2 - make form fields sticky when there is error submitting form

我正在研究Zend框架2.我有一個用於保存商店信息的表單。 我已經使用Zend的輸入過濾器驗證了表單。 我的問題是,當我在字段中輸入錯誤數據或將必填字段留空時,它會正確顯示錯誤,但整個表單再次變為空白。

我希望以前輸入的值與表單顯示錯誤時一樣。

以下是呈現表單的函數。

public function settingsAction()
{
        try {

            $message = '';
            $error = '';
            $id = 0;
            try {
                $shop = $this->_getShop();
            } catch (\Exception $ex) {
                AppLogger::log($ex);
                $error = $ex->getMessage();
            }
            if ($shop) {
                $id = $shop->id;
            }
            else {
                //redirect to login page
                return $this->redirect()->toUrl($this->_getDomainUrl());
            }

            $form = new ShopForm($this->serviceLocator);
            $config = $this->serviceLocator->get('config');
            $apiUrls = $config['apiUrls'];

            $request = $this->getRequest();
            if ($request->isPost()) 
            {
                if (!$shop)
                    $shop = new Shop();
                $form->setInputFilter($shop->getInputFilter());
                $form->setData($request->getPost());

                if ($form->isValid()) {
                    $url = $shop->url;
                    $token = $shop->token;
                    $config_id = $shop->config_id;
                    $password = $shop->password;
                    $shop->exchangeArray($form->getData(),false);
                    $shop->url = $url;
                    $shop->token = $token;
                    $shop->config_id = $config_id;
                    DAL::getShopTable($this->serviceLocator)->saveShop($shop);
                    $message = "Your settings has been saved successfully.";
                }
                else {
                    $error = 'There are values that need to be completed before you can save/update your preferences.';

                   foreach($form->getMessages() as $msg) {
                        $error = $error . $msg;
                    }
                }
            }

            if ($shop) 
            {
                echo "<pre>";print_r($shop);
                $shop->selected_countries = unserialize($shop->selected_countries);
                $form->bind($shop);
                $form->get('return_address_country')->setAttribute('value', $shop->return_address_country);
            }

            $form->get('submit')->setAttribute('value', 'Save');
            return array(
                'id' => $id,
                'form' => $form,
                'apiUrls' => $apiUrls,
                'message' => $message,
                'uri' => $this->_selfURL(),
                "error" => $error

            );
        }
        catch (\Exception $ex) {
            AppLogger::log($ex);
            throw $ex;
        }
    }

我用過$form->setInputFilter($shop->getInputFilter()); 用於驗證。 getInputFilter()片段如下:

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

            $inputFilter->add(array(
                'name' => 'id',
                'required' => true,
                'filters' => array(
                    array('name' => 'Int'),
                ),
            ));
            $inputFilter->add(array(
                'name' => 'ship_to_code',
                'required' => false,
                'filters' => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min' => 0,
                            'max' => 50,
                        ),
                    ),
                ),
            ));
            $inputFilter->add(array(
                'name' => 'default_phone',
                'required' => false,
                'filters' => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min' => 0,
                            'max' => 50,
                        ),
                    ),
                ),
            ));
            $inputFilter->add(array(
                'name' => 'max_records_per_file',
                'required' => true,
                'filters' => array(
                    array('name' => 'Int'),
                ),
            ));
    }

形式是

$this->add(array(
        'name' => 'id',
        'type' => 'Hidden',
    ));
    $this->add(array(
        'name' => 'ship_to_code',
        'type' => 'Text',
        'options' => array(
            'label' => 'Ship-To Code',
        ),
    ));
    $this->add(array(
        'name' => 'default_phone',
        'type' => 'Text',
        'options' => array(
            'label' => 'Default Phone',
        ),
    ));

您可以在設置操作中使用表單的setdata()方法。 這是更新的代碼

 if ($shop) 
            {
              //  echo "<pre>";print_r($shop);
              //  $shop->selected_countries = unserialize($shop->selected_countries);
                $form->bind($shop);
                $form->setData($request->getPost()); // set post data to form
            }

暫無
暫無

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

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