在表单中保留选择字段的旧值-Zend Framework 2

如何解决在表单中保留选择字段的旧值-Zend Framework 2

我正在使用ZF 2.8开发应用程序,并且试图在用户输入错误的情况下保持表单的值。

如果存在用户输入错误,但其他字段(类型<input>)的旧数据仍“在那里”,但对于<select>不起作用,我不明白为什么。 ..?!

这是控制器的代码:

public function addAction() {
        $form = new InscriptionForm();  
        $form->get('submit')->setValue('Add');

        $request = $this->getRequest();
        if ($request->isPost()) {
            $inscription = new Inscription();
            $form->setInputFilter($inscription->getInputFilter());
            $form->setData($request->getPost());
            if ($form->isValid() && ($request->getPost('ACTIVITE1') != 0 || $request->getPost('ACTIVITE2') != 0 || $request->getPost('ACTIVITE3') != 0)) {
                $data = $form->getData();
                $inscription->exchangeArray($data);
                $lastId = $this->getInscriptionTable()->saveInscription($inscription);
                $sm = $this->getServiceLocator();
                $adapter = $sm->get('Zend\Db\Adapter\Adapter');
// code - requests
 } else {
                $sm = $this->getServiceLocator();
                $adapter = $sm->get('Zend\Db\Adapter\Adapter');
                $statement = $adapter->query(
                    "
                    SELECT *
                    FROM session
                    "
                );
                $results = $statement->execute();
                if ($request->getPost('ACTIVITE1') == 0 && $request->getPost('ACTIVITE2') == 0 && $request->getPost('ACTIVITE3') == 0) {
                    return new ViewModel(array(
                        'errors' => 'Le formulaire contient une ou plusieurs erreurs : Au moins une activité doit être renseignée.','form' => $form,'sessions' => $results
                    ));
                } else {
                    return new ViewModel(array(
                        'errors' => 'Le formulaire contient une ou plusieurs erreurs.','sessions' => $results
                    ));
                }
            }
        }
        $sm = $this->getServiceLocator();
        $adapter = $sm->get('Zend\Db\Adapter\Adapter');
        $statement = $adapter->query(
            "
            SELECT *
            FROM session
            "
        );
        $results = $statement->execute();
            
        return new ViewModel(array(
            'form' => $form,'sessions' => $results
        ));
    }

模型题词:

<?php

namespace Inscription\Model;

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
use Zend\Validator\StringLength;
use Zend\Validator\NotEmpty;
use Zend\Validator\Date;
use Zend\Validator\Regex;

class Inscription implements InputFilterAwareInterface {

    public $id_inscription;
    public $dt_inscription;
    // i delete some attributes because the post was too long
    // from insc_sess
    public $activite1;
    public $activite2;
    public $activite3;

    protected $inputFilter;

    public function getArrayCopy() {
        return get_object_vars($this);
    }

    public function exchangeArray($data) {
        $this->id_inscription     = (!empty($data['ID_INSCRIPTION'])) ? $data['ID_INSCRIPTION'] : null;
        $this->dt_inscription = (!empty($data['DT_INSCRIPTION'])) ? $data['DT_INSCRIPTION'] : null;

        $this->nom_enfant  = (!empty($data['NOM_ENFANT'])) ? $data['NOM_ENFANT'] : null;
        $this->prenom_enfant     = (!empty($data['PRENOM_ENFANT'])) ? $data['PRENOM_ENFANT'] : null;
        $this->sexe_enfant = (!empty($data['SEXE_ENFANT'])) ? $data['SEXE_ENFANT'] : null;
        $this->dtNaissance_enfant  = (!empty($data['DTNAISSANCE_ENFANT'])) ? $data['DTNAISSANCE_ENFANT'] : null;
        $this->nom_ecole    = (!empty($data['NOM_ECOLE'])) ? $data['NOM_ECOLE'] : null;

        $this->resp1 = (!empty($data['RESP1'])) ? $data['RESP1'] : null;
        $this->adresse_resp1  = (!empty($data['ADRESSE_RESP1'])) ? $data['ADRESSE_RESP1'] : null;
        $this->tel_Resp1     = (!empty($data['TEL_RESP1'])) ? $data['TEL_RESP1'] : null;
        $this->mail_Resp1 = (!empty($data['MAIL_RESP1'])) ? $data['MAIL_RESP1'] : null;

        $this->resp2  = (!empty($data['RESP2'])) ? $data['RESP2'] : null;
        $this->adresse_resp2  = (!empty($data['ADRESSE_RESP2'])) ? $data['ADRESSE_RESP2'] : null;
        $this->tel_Resp2  = (!empty($data['TEL_RESP2'])) ? $data['TEL_RESP2'] : null;
        $this->mail_Resp2 = (!empty($data['MAIL_RESP2'])) ? $data['MAIL_RESP2'] : null;

        $this->activite1 = (!empty($data['ACTIVITE1'])) ? $data['ACTIVITE1'] : null;
        $this->activite2 = (!empty($data['ACTIVITE2'])) ? $data['ACTIVITE2'] : null;
        $this->activite3 = (!empty($data['ACTIVITE3'])) ? $data['ACTIVITE3'] : null;

        $this->autorise1  = (!empty($data['AUTORISE1'])) ? $data['AUTORISE1'] : null;
        $this->autorise2     = (!empty($data['AUTORISE2'])) ? $data['AUTORISE2'] : null;
        $this->saitNager = (!empty($data['SAITNAGER'])) ? $data['SAITNAGER'] : null;
        $this->traitement  = (!empty($data['TRAITEMENT'])) ? $data['TRAITEMENT'] : null;
        $this->ouiTraitement     = (!empty($data['OUITRAITEMENT'])) ? $data['OUITRAITEMENT'] : null;
        $this->allergies = (!empty($data['ALLERGIES'])) ? $data['ALLERGIES'] : null;
        $this->autresAllergies  = (!empty($data['AUTRESALLERGIES'])) ? $data['AUTRESALLERGIES'] : null;
        $this->autreSante     = (!empty($data['AUTRESSANTE'])) ? $data['AUTRESSANTE'] : null;

        $this->coche = (!empty($data['COCHE'])) ? $data['COCHE'] : null;
        $this->dateNew  = (!empty($data['DTNEW'])) ? $data['DTNEW'] : null;
        $this->utilNew     = (!empty($data['UTILNEW'])) ? $data['UTILNEW'] : null;
        $this->dateMAJ = (!empty($data['DTMAJ'])) ? $data['DTMAJ'] : null;
        $this->utilMAJ  = (!empty($data['UTILMAJ'])) ? $data['UTILMAJ'] : null;
    }

    public function setInputFilter(InputFilterInterface $inputFilter) {
        throw new \Exception("Not used");
    }

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

            $inputFilter->add(array(
                'name'     => 'DTNAISSANCE_ENFANT','required' => true,'filters'  => array(
                    array('name' => 'StripTags'),array('name' => 'StringTrim'),),'validators' => array(
                    array(
                        'name' => 'NotEmpty','options' => array(
                            'messages' => array(
                                NotEmpty::IS_EMPTY => "Champ obligatoire"
                            )
                        )
                    ),));

            $inputFilter->add(array(
                'name'     => 'SAITNAGER',));

            $inputFilter->add(array(
                'name'     => 'TRAITEMENT',));

            $inputFilter->add(array(
                'name'     => 'COCHE',));
            
            $this->inputFilter = $inputFilter;
        }
        return $this->inputFilter;
    }
}

InscriptionForm类:

<?php

namespace Inscription\Form;

use Zend\Form\Form;
use Zend\Form\Element;
use Zend\Form\Element\Date;

class InscriptionForm extends Form {

    public function __construct($name = null) {
        parent::__construct('inscription');

        $this->add(array(
            'name' => 'ID_INSCRIPTION','type' => 'hidden','required' => 'required'
        ));

        $this->add(array(
            'name' => 'NOM_ENFANT','type' => 'Text','required' => 'required','options' => array(
                'label' => ' * Nom :','attributes' => array(
                'class' => 'form-control','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'PRENOM_ENFANT','options' => array(
                'label' => '* Prénom :','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'SEXE_ENFANT','type' => 'Zend\Form\Element\Radio','options' => array(
                'label' => '* Sexe :','value_options' => array(
                    'F' => 'Fille','G' => 'Garçon','attributes' => array(
               
            )
        ));

        $this->add(array(
            'name' => 'DTNAISSANCE_ENFANT','options' => array(
                'label' => '* Date de naissance :','attributes' => array(
                'class' => 'form-control date-field','id' => 'input-dtNaissance','placeholder' => 'jj/mm/AAAA','pattern' => '^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$'
            )
        ));

        $this->add(array(
            'name' => 'NOM_ECOLE','options' => array(
                'label' => '* Nom de l\'école :','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'ACTIVITE1','type' => 'Zend\Form\Element\Select','options' => array(
                'value_options' => array(
                    'Choisir l\'activité'
                ),'disable_inarray_validator' => true,'id' => 'select-session1'
            )
        ));

        $this->add(array(
            'name' => 'ACTIVITE2','id' => 'select-session2'
            )
        ));

        $this->add(array(
            'name' => 'ACTIVITE3','id' => 'select-session3'
            )
        ));

        $this->add(array(
            'name' => 'RESP1','options' => array(
                'label' => '* Nom,prénom Responsable 1:','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'ADRESSE_RESP1','options' => array(
                'label' => '* Adresse Responsable 1:','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'TEL_RESP1','options' => array(
                'label' => '* Téléphone Responsable 1:','attributes' => array(
            'pattern' => '^0[1-78]([-. ]?[0-9]{2}){4}$','class' => 'form-control','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'MAIL_RESP1','type' => 'Zend\Form\Element\Email','options' => array(
                'label' => '* Mail Responsable 1:','attributes' => array(
                'class' => 'form-control'
            )
        ));

        $this->add(array(
            'name' => 'RESP2','options' => array(
                'label' => 'Nom,Prénom Responsable 2 :','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'ADRESSE_RESP2','options' => array(
                'label' => 'Adresse Responsable 2 :','style' => 'text-transform : uppercase'
            ),'attributes' => array(
                'class' => 'form-control'
            )
        )); 

        $this->add(array(
            'name' => 'TEL_RESP2','options' => array(
                'label' => 'Téléphone Responsable 2 :','attributes' => array(
                'pattern' => '^0[1-78]([-. ]?[0-9]{2}){4}$','style' => 'text-transform : uppercase'
            )
        )); 

        $this->add(array(
            'name' => 'MAIL_RESP2',//'type' => 'Zend\Form\Element\Email','options' => array(
                'label' => 'Mail Responsable 2 :',)
        ));

        $this->add(array(
            'name' => 'AUTORISE1',prénom :','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'AUTORISE2','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'SAITNAGER','type' => 'Zend\Form\Element\Checkbox','options' => array(
                'label' => 'Sait Nager :','use_hidden_element' => true,'checked_value' => 'O','unchecked_value' => 'N'
            ),'attributes' => array(
                'id' => 'input-SaitNager'
            )
        ));

        $this->add(array(
            'name' => 'TRAITEMENT','options' => array(
                'label' => 'Traitement :','attributes' => array(
                'id' => 'input-Traitement'
            )
        ));

        $this->add(array(
            'name' => 'OUITRAITEMENT','options' => array(
                'label' => 'Si oui lequel :','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'ALLERGIES','options' => array(
                'disable_inarray_validator' => true,'label' => '* Allergies : ','value_options' => array(
                    'Aucune' => 'Aucune','Asthmatiques' => 'Asthmatiques','Médicamenteuses' => 'Médicamenteuses','Alimentaires' => 'Alimentaires','Autres' => 'Autres','attributes' => array(
                'id' => 'input-allegies'
            )
        ));

        $this->add(array(
            'name' => 'AUTRESALLERGIES','options' => array(
                'label' => 'Si autres,précisez :','attributes' => array(
                'id' => 'input-autresallergies','style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'AUTRESSANTE','type' => 'Zend\Form\Element\Textarea','options' => array(
                'label' => 'Autres difficultés de santé :','attributes' => array(
                'id' => 'input-autresante','rows' => "5",'style' => 'text-transform : uppercase'
            )
        ));

        $this->add(array(
            'name' => 'COCHE','options' => array(
                'label' => '* Je certifie que ces informations sont correctes :','unchecked_value' => ''
            ),'attributes' => array(
                'id' => 'checkbox-coche'
            )
        ));

        $this->add(array(
            'name' => 'submit','type' => 'submit','options' => array(
                'value' => 'Valider','attributes' => array(
                'id' => 'validation-form-inscription','class' => 'button-default'
            )
        ));
    }
}

我的问题所涉及的选择名为ACTIVITE1 / ACTIVITE2 / ACTIVITE3 ... 这些选择的选项是用json加载,其想法是根据表格中告知的出生日期提议活动。

这是加载select的选项的jQuery代码:

        $().ready(function() {
            var dateNaissance = $("#input-dtNaissance").val();
            if (dateNaissance != "") {
                var year = $("#input-dtNaissance").val().substring(6,10);
                if (year == "") {
                    year = 1;
                }
                // si date supprimée/réinitialisée 
                if (year == 1) {
                // on supprime les activités proposées du select
                $(".activites-options").remove();
                } else {
                    $.getJSON("<?php echo $this->basePath() ?>/activite/listActivitySession1/" + year,function(data) {
                        data.forEach(function(element) {
                            var option = "<option value='" + element.ID_ACTIVITES + "' class='activites-options'>" +element.activite[0] + element.activite.substring(1).toLowerCase() + " avec " + element.INTERVENANT + " - " + element.HORAIREDEB + "/" + element.HORAIREFIN + " (" + element.site[0] + element.site.substring(1).toLowerCase() + ")" + "</option>";
                            $("#select-session1").append(option);
                        });
                    });
                    $.getJSON("<?php echo $this->basePath() ?>/activite/listActivitySession2/" + year,function(data) {
                        data.forEach(function(element) {
                            var option = "<option value='" + element.ID_ACTIVITES + "'class='activites-options'>" + element.activite[0] + element.activite.substring(1).toLowerCase() + " avec " + element.INTERVENANT + " - " + element.HORAIREDEB + "/" + element.HORAIREFIN + " (" + element.site[0] + element.site.substring(1).toLowerCase() + ")" + "</option>";
                            $("#select-session2").append(option);
                        });
                    });
                    $.getJSON("<?php echo $this->basePath() ?>/activite/listActivitySession3/" + year,function(data) {
                        data.forEach(function(element) {
                            var option = "<option value='" + element.ID_ACTIVITES + "' class='activites-options'>" + element.activite[0] + element.activite.substring(1).toLowerCase() + " avec " + element.INTERVENANT + " - " + element.HORAIREDEB + "/" + element.HORAIREFIN + " (" + element.site[0] + element.site.substring(1).toLowerCase() + ")" + "</option>";
                            $("#select-session3").append(option);
                        });
                    });
                }
            }
        })

如果有人提出想法,我将不胜感激,因为我现在有点被卡住了!预先感谢...

解决方法

正如我在评论中所说,问题在于您的选择元素没有任何选择。

这意味着,在验证时,表单会尝试绑定并验证不在他知道的选项中的值。

实际上,情况如下:

  • 您创建一个Select元素,没有任何选择
  • 您将此选择添加到表单
  • 您在控制器中创建表单并将其传递给视图
  • 在视图中,您打印以下选项(值,标签):
    • 1,足球
    • 2,骑单车
    • 3,篮子
    • 4,Pétanque

这些值仅存在于视图中。对于表单,所有这些值都不存在。这意味着:

  • 您点击“提交按钮”,发送POST请求
  • 您将数据设置为表单
  • 表单将尝试将值“ 4”绑定到元素activite1
  • 表单将无法绑定此值,因为它不是您选择的有效选项(因为您将其创建为空)
  • activity1将结果为空,并将其传递给视图

这就是为什么表格中有错误时会影响这些选择的值的原因。

要解决此问题,您必须(最佳解决方案):

  • 创建一个自定义元素类,例如ActivitySelect,您将在其中创建带有所有这些选项的select
  • 您将使用Select
  • ,而不是在表单中使用ActivitySelect类型
  • 您将创建所有需要的工厂
  • 您将通过FormElementManager检索表单。

一个类似,简单且较差的解决方案是为表单创建一个工厂,在该工厂中,您将传递所有必需的对象以为表单创建选项。这样可以避免创建自定义元素类,但我发现此解决方案对于可维护性而言并非如此

由于这个问题已经回答了几次,所以我将避免在此处重写所有内容并链接一个:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-