Symfony表单保存重复的旧数据

时间:2017-09-18 14:44:03

标签: php forms symfony save

用户可以使用ajax在弹出窗口中创建带有表单的项目。他们使用Chrome来访问该工具。

问题在于,有时当他们创建新项目时,表单会保存以前项目的信息,因此他们会丢失新项目的数据。

是否有人已经遇到此问题并知道如何解决此问题?这是浏览器缓存的问题吗?

感谢您的帮助!

编辑这是我的代码

Twig view

<!-- Formulaire de création d'un nouveau projet -->
{{ form_start(form, { 'attr': {'class': 'form-horizontal'} }) }}
{{ form_start(formGroupe, { 'attr': {'class': 'form-horizontal'} }) }}

<div class="row">
    <div class="col-sm-offset-1 sous-titre-cartouche cartouche-1">
        <p>Le groupe de projets</p>
        <hr>
    </div>
</div>

<br>

<!-- Choix du groupe -->
<div class="row">
    <div class="col-sm-offset-1">
        <label for="choixGroupe"><img src="{{ asset('picto/commercial/1-1.png') }}" class="picto-number"> Ce projet fait-il partie d'un groupe de projets ? <span class="required">*</span></label>

        <input type="radio" name="choixGroupe" id="radioOui" value="1" {% if projet is defined and projet.groupe != null %}checked{% endif %}>
        <label for="radioOui" class="required">Oui</label>

        <input type="radio" name="choixGroupe" id="radioNon" value="0" {% if projet is not defined or (projet is defined and projet.groupe == null) %}checked{% endif %}>
        <label for="radioNon" class="required">Non</label>
    </div>
</div>

<br>

<!-- Choix du groupe2 -->
<div class="row group-choixGroupe2">
    <div class="col-sm-offset-1">
        <label for="choixGroupe2"><img src="{{ asset('picto/commercial/1-2.png') }}" class="picto-number"> Voulez-vous choisir un groupe de projets déjà existant ? <span class="required">*</span></label>

        <input type="radio" name="choixGroupe2" id="radioOui2" value="1" {% if choixGroupe is defined and choixGroupe == '1' %}checked{% endif %}>
        <label for="radioOui2" class="required">Oui</label>

        <input type="radio" name="choixGroupe2" id="radioNon2" value="0" {% if choixGroupe is defined and choixGroupe == '0' %}checked{% endif %}>
        <label for="radioNon2" class="required">Non</label>
    </div>
</div>

<br class="group-existant">

<!-- Groupe existant -->
<div class="row group-existant">
    <div class="col-sm-offset-1">
        <label for="groupeExistant"><img src="{{ asset('picto/commercial/1-3.png') }}" class="picto-number"> Sélectionner le groupe de projets existant : <span class="required">*</span></label>
        {{ form_widget(formGroupe.groupeExistant) }}
    </div>
</div>

<br class="group-nouveau">

<!-- Nouveau groupe -->
<div class="row group-nouveau">
    <div class="col-sm-offset-1">
        <label for="groupeNom"><img src="{{ asset('picto/commercial/1-3.png') }}" class="picto-number"> Créer un nouveau groupe de projets : <span class="required">*</span></label>
        {{ form_widget(formGroupe.objet, { 'attr': {'placeholder': 'Champ à définir'} }) }}
    </div>
</div>

<br>

<!-- Groupe description -->
<div class="row group-description">
    <div class="col-sm-offset-1">
        <label for="groupeDescription"><img src="{{ asset('picto/commercial/1-4.png') }}" class="picto-number"> Description du groupe de projets : <span class="required">*</span></label>
        <br>
        <br>
        <textarea name="groupeDescription" class="description">{% if projet is defined and projet.groupe != null %}{{ projet.groupe.description }}{% endif %}</textarea>
    </div>
</div>

<br>

<div class="row">
    <div class="col-sm-offset-1 sous-titre-cartouche cartouche-2">
        <p>Le client</p>
        <hr>
    </div>
</div>

<br>

<div class="row">
    <div class="col-sm-offset-1">
        <label for="groupe_client"><img src="{{ asset('picto/commercial/2-1.png') }}" class="picto-number"> Sélectionner les champs suivants : <span class="required">*</span></label>
    </div>
</div>

<br>

<div class="row">
    <!-- Groupe -->
    <div class="col-sm-offset-1 projet-client">
        {{ form_widget(form.client, { 'attr': {'class': 'col-sm-2'} }) }}
        <input type="hidden" name="creationProjet[client]" id="hiddenClient" disabled>
    </div>

    <!-- Filiale -->
    <div class="projet-filiale">
        {{ form_widget(form.filiale, { 'attr': {'class': 'col-sm-offset-1 col-sm-2'} }) }}
        <input type="hidden" name="creationProjet[filiale]" id="hiddenFiliale" disabled>
    </div>

    <!-- Contact -->
    <div class="projet-contact">
        {{ form_widget(form.contact, { 'attr': {'class': 'col-sm-offset-1 col-sm-2'} }) }}
        <input type="hidden" name="creationProjet[contact]" id="hiddenContact" disabled>
    </div>
</div>

<br>

<div class="row">
    <div class="col-sm-offset-1 sous-titre-cartouche cartouche-3">
        <p>Le projet</p>
        <hr>
    </div>
</div>

<br>

<div class="row">
    <!-- Expertise -->
    <div class="col-sm-offset-1 col-sm-5 col-expertise">
        <label for="expertise"><img src="{{ asset('picto/commercial/3-1.png') }}" class="picto-number"> Sélectionner le type d'expertise : <span class="required">*</span></label>
        <br>
        <br>
        {{ form_widget(form.expertise, { 'attr': {'class': 'col-sm-5'} }) }}
    </div>

    <!-- Objet -->
    <div class="col-sm-5">
        <label for="objet"><img src="{{ asset('picto/commercial/3-4.png') }}" class="picto-number"> Remplir l'intitulé et la description du projet : <span class="required">*</span></label>
        <br>
        <br>
        {{ form_widget(form.objet, { 'attr': {'placeholder': 'Champ à remplir' , 'class': 'col-sm-11'} }) }}
    </div>
</div>

<br>

<div class="row">

    <div class="col-sm-offset-1 col-sm-5">
        <!-- Impression -->
        <div class="row group-impression">
            <label for="impression"><img src="{{ asset('picto/commercial/3-2.png') }}" class="picto-number"> Ce projet est-il imprimé ? <span class="required">*</span> </label>
            {{ form_widget(form.impression) }}
        </div>

        <br>

        <div class="row datesProjet">
            <label for="dates"><img src="{{ asset('picto/commercial/3-3.png') }}" class="picto-number"> Choisir les dates de début et de fin : <span class="required">*</span> </label>
            <br>
            <br>

            <!-- Date de début -->
            <div class="col-sm-6 group-dateDebut">
                <label for="dateDebut">Date de début : </label>
                {{ form_widget(form.dateDebut) }}
            </div>

            <!-- Date de fin -->
            <div class="col-sm-6 group-dateFin">
                <label for="dateFin">Date de fin : <span class="required">*</span></label>
                {{ form_widget(form.dateFin) }}
            </div>
        </div>

        <br>

        <div class="row datesImpression">
            <!-- Date de mise en impression -->
            <div class="col-sm-6">
                <label for="dateImpression">Date de mise en impression : </label>
                {{ form_widget(form.dateImpression) }}
            </div>
        </div>
    </div>

    <!-- Description -->
    <div class="col-sm-5">
        <textarea name="projetDescription" class="description">{% if projet is defined %}{{ projet.description }}{% endif %}</textarea>
    </div>

</div>

<br>

<!-- Message d'erreur -->
<div class="row">
    <div class="col-sm-offset-1 col-sm-10">
        <span class="error date-erreur"></span>
    </div>
</div>

<br>

<div class="row">
    <div class="col-sm-offset-1 col-sm-10 hr-footer">
        <hr>
    </div>
</div>

<br>

<!-- Bouton Enregistrer ou Modifier -->
<div class="row">
    <div class="col-sm-offset-8 col-sm-1">
        <span class="glyphicon glyphicon-repeat spinner noactive"></span>
    </div>
    <div class="col-sm-2">
        {{ form_widget(form._token) }}
        {{ form_widget(formGroupe._token) }}
        {% if projet is defined %}
            <input type="submit" class="modifier-submit">
        {% else %}
            <input type="submit" class="creer-submit cursor">
        {% endif %}
    </div>
</div>

{{ form_end(formGroupe) }}
{{ form_end(form) }}

控制器

/**
 * Action pour le formulaire de création d'un projet
 */
public function indexAction()
{
    $request = $this->getRequest();

    $em = $this->getDoctrine()->getManager();

    /* On crée un nouveau projet */
    $projet = new Projet();

    /* On crée un nouveau groupe */
    $groupe = new Groupe();

    /* On récupère le formulaire */
    $form = $this->createForm(new CreationProjetType($this->getDoctrine()->getManager()), $projet);
    $formGroupe = $this->createForm(new CreationGroupeType());        

    /* On redirige vers le formulaire de création du projet */
    return $this->render('CommercialBundle:CreationProjet:index.html.twig',
        array('utilisateur' => $this->getUser() ,
                'form' => $form->createView() ,
                'formGroupe' => $formGroupe->createView() ));
}


/**
 * Action pour la création d'un projet + Modification d'un projet
 */
public function creerAjaxAction(Request $request) 
{
    $em = $this->getDoctrine()->getManager();

    $manager = new Manager($em);

    /* On crée un nouveau projet */
    $projet = new Projet();

    /* On crée un nouveau groupe */
    $groupe = new Groupe();

    /* On récupère le groupe du projet */
    $choixGroupe = $request->request->get('choixGroupe');
    $choixGroupe2 = $request->request->get('choixGroupe2');
    $groupeDescription = $request->request->get('groupeDescription');        

    /* On récupère les formulaires */
    $form = $this->createForm(new CreationProjetType($this->getDoctrine()->getManager()), $projet);
    $formGroupe = $this->createForm(new CreationGroupeType());


    if($request->isXmlHttpRequest()) {
        $form->bind($request);
        $formGroupe->bind($request);

        if($form->isValid()) {
            /* On récupère les données du formulaire */
            $dataProjet = $this->getRequest()->request->get('creationProjet');
            $dataGroupe = $this->getRequest()->request->get('creationGroupe');


            /* On enregistre l'objet */
            $projet->setObjet($manager->pregSlash($dataProjet['objet']));


            /* On enregistre l'expertise */
            $expertise = new Expertise();
            $expertise = $em->getRepository('CommercialBundle:Expertise')->find($dataProjet['expertise']);
            $projet->setExpertise($expertise);


            /* On enregistre la description */
            $projet->setDescription($request->request->get('projetDescription'));


            /* On enregistre la date de création */
            $projet->setDateCreation(new \DateTime(date('Y-m-d')));


            /* On enregistre l'état du projet */
            $etat = new Etat();
            $etat = $em->getRepository('CommercialBundle:Etat')->find(10);
            $projet->setEtat($etat);


            /* On enregistre le chef de projet */
            $user = new Utilisateur();
            $user = $em->getRepository('UtilisateurBundle:Utilisateur')->find($this->getUser());
            $projet->setCreateur($user);


            /* Si le nouveau projet ne fait pas parti d'un groupe */
            if($choixGroupe == '0') {
                /* On enregistre le contact */
                $contact = new Contact();
                $contact = $em->getRepository('ClientBundle:Contact')->find($dataProjet['contact']);
                $projet->setContact($contact);


                /* On enregistre la filiale */
                $filiale = new Filiale();
                $filiale = $em->getRepository('ClientBundle:Filiale')->find($dataProjet['filiale']);
                $projet->setFiliale($filiale);


                /* On récupère le dernier projet créé */
                $projetLast = $em->getRepository('CommercialBundle:Projet')->findOneBy(array(), array('numeroDossier' => 'DESC'));
                /* S'il a au moins un projet créé */
                if($projetLast != null) {
                    /* On incrémente le numéro de dossier de dernier projet créé */
                    $numeroDossier = $projetLast->getNumeroDossier() + 1;
                    if($numeroDossier < 10)
                        $numeroDossier = '00'.$numeroDossier;
                    else
                        $numeroDossier = '0'.$numeroDossier;
                    /* On enregistre le numéro de dossier */
                    $projet->setNumeroDossier($numeroDossier);
                }
                else {
                    /* On enregistre le numéro de dossier à 1 */
                    $projet->setNumeroDossier('001');
                }

            }
            /* Si le nouveau projet fait parti d'un groupe de projets */
            else {
                /* Si le projet fait partie d'un nouveau groupe */
                if($choixGroupe2 == '0') {
                    /* On enregistre le contact */
                    $contact = new Contact();
                    $contact = $em->getRepository('ClientBundle:Contact')->find($dataProjet['contact']);
                    $projet->setContact($contact);


                    /* On enregistre la filiale */
                    $filiale = new Filiale();
                    $filiale = $em->getRepository('ClientBundle:Filiale')->find($dataProjet['filiale']);
                    $projet->setFiliale($filiale);


                    /* On enregistre l'état */
                    $groupe->setEtat('1');


                    /* On enregistre l'objet */
                    $groupe->setObjet($manager->pregSlash($dataGroupe['objet']));


                    /* On enregistre la description */
                    $groupe->setDescription($groupeDescription);


                    /* On enregistre le contact */
                    $groupe->setContact($contact);


                    /* On enregistre la filiale */
                    $groupe->setFiliale($filiale);


                    /* On enregistre la date de création */
                    $groupe->setDateCreation(new \DateTime(date('Y-m-d')));


                    /* On récupère le dernier projet créé */
                    $projetLast = $em->getRepository('CommercialBundle:Projet')->findOneBy(array(), array('numeroDossier' => 'DESC'));

                    /* S'il a au moins un projet créé */
                    if($projetLast != null) {
                        /* On incrémente le numéro de dossier de dernier projet créé */
                        $numeroDossier = $projetLast->getNumeroDossier() + 1;
                        if($numeroDossier < 10)
                            $numeroDossier = '00'.$numeroDossier;
                        else
                            $numeroDossier = '0'.$numeroDossier;
                    }
                    else {
                        $numeroDossier = '001';
                    }


                    /* On enregistre le numéro de dossier du groupe */
                    $groupe->setNumeroDossier($numeroDossier);


                    /* On enregistre le numéro de dossier du projet */
                    $projet->setNumeroDossier($numeroDossier);
                    $projet->setNumeroProjet('001');


                    /* On enregistre le groupe */
                    $projet->setGroupe($groupe);


                    $em->persist($groupe);                        
                }
                /* Si le projet fait partie d'un groupe de projets déjà existant */
                else {
                    /* On récupère le groupe */
                    $groupe = $em->getRepository('CommercialBundle:Groupe')->find($dataGroupe['groupeExistant']);  


                    /* On enregistre le contact */
                    $contact = new Contact();
                    $contact = $em->getRepository('ClientBundle:Contact')->find($groupe->getContact()->getId());
                    $projet->setContact($contact);


                    /* On enregistre la filiale */
                    $filiale = new Filiale();
                    $filiale = $em->getRepository('ClientBundle:Filiale')->find($groupe->getFiliale()->getId());
                    $projet->setFiliale($filiale); 


                    /* On enregistre le numéro de dossier du projet */
                    $projet->setNumeroDossier($groupe->getNumeroDossier());
                    /* On récupère les projets du groupe */
                    $projetDuGroupe = $em->getRepository('CommercialBundle:Projet')->findBy(array('groupe' => $groupe));
                    $m = '001';
                    if(sizeof($projetDuGroupe) != 0) {
                        $m = sizeof($projetDuGroupe) + 1;
                        if($m < 10)
                            $m = '00'.$m;
                        else
                            $m = '0'.$m;
                    }


                    /* On enregistre le numéro de projet du projet */
                    $projet->setNumeroProjet($m);


                    /* On enregistre le groupe */
                    $projet->setGroupe($groupe);
                }
            }        


            /* On enregistre l'impression */
            if($dataProjet['impression'] != null) {
                $projet->setImpression($dataProjet['impression']);
            }


            $em->persist($projet);
            $em->flush();
      return $response;
}

的Ajax

/**
 * Affichage du pop-up
 */ 
function nouveauProjet() {
    var route = '{{ path("nouveau_projet") }}';

    return $.ajax({
        type: 'GET',
        url: route,
        success: function(data) {
            $('.modal.modal-creation-projet-active')
                .modal('show');
            $('.modal-creation-projet-active .modal-body')
                .empty()
                .append(data);

            /* Fonction editeurTexte() */
            editeurTexte();

            /* Fonction clientFiliale() */
            $('#creationProjet_client').change(function(){
                /* Id du groupe sélectionné */
                var client = $(this).val();
                clientFiliale(client,'#creationProjet_filiale');
            });

            /* Fonction clientContact() */
            $('#creationProjet_filiale').change(function(){
                /* Id de la filiale sélectionnée */
                var filiale = $(this).val();
                clientContact(filiale,'#creationProjet_contact');
            });

            /* Gestion des éléments du groupe de projet */
            formElement();


            /* On bloque l'envoi du formulaire par la touche Entrée */
            $('.noEnterSubmit').keypress(function(e){
                if ( e.which == 13 ) return false;
            });


            /* A l'envoi du formulaire */
            $('form[name=creationProjet]').submit(function (e) {
                e.preventDefault();

                /* Fonction formErrorDate() */
                if(!formErrorDate()) {
                    /* Fonction creationProjetSubmit() */
                    creationProjetSubmit();
                }
            });

        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });
}



/**
 * Action à l'envoi du formulaire (création)
 */
function creationProjetSubmit() {
    /* On initialise la route */
    var url = '{{ path("nouveau_projet_ajax") }}';

    return $.ajax({
        type: "POST",
        data: $('form[name=creationProjet]').serialize(),
        url: url,
        cache: false,
        success: function(data){
            $('.modal.modal-creation-projet-active')
                .modal('show');
            $('.modal-creation-projet-active .modal-body')
                .empty()
                .append(data);

            $('.close-modal').css('display','none');

            $('.btn-modifier-projet').click(function (e) {
                e.preventDefault();

                /* On récupère l'id du projet dans le bouton modifier */
                var id = $(this).attr('id');

                /* On récupère le choix du projet : nouveau (=0) ou existant (=1) */
                var choixGroupe = $(this).attr('choixGroupe');

                /* On active le loader */
                $('.glyphicon.spinner').removeClass('noactive').addClass('active');

                /* Fonction modifierProjet(id) */
                modifierProjet(id,choixGroupe);
            });
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(textStatus, errorThrown);
        }
    });
}

2 个答案:

答案 0 :(得分:0)

你的问题质量很差。

  

是否有人已经遇到此问题并知道如何解决此问题?

这听起来像是非常糟糕的代码。检查比ajax新弹出窗口确实提供了一个新表单(隐藏输入等...)。检查项目的id是如何持久化的,它不应该包含在表单数据中。

  

浏览器的缓存有问题吗?

否(未缓存帖子请求)

答案 1 :(得分:0)

在我的控制器中,我这样称呼我的表格:

$projet = new Projet(); 
$form = $this->createForm(new CreationProjetType($this->getDoctrine()->getManager()), $projet);

你认为它可以获得以前的$项目吗?