IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Form] Personnalisation des formulaires imbriqués [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut [Form] Personnalisation des formulaires imbriqués
    Bonjour à tous,

    j'aimerais avoir vos conseils sur la personnalisation de formulaires imbriqués.

    j'ai une entité personne en relation OneToOne avec une entité "Medical"

    L'entité "Personne" est aussi en relation OneToMany avec une entité "Activite"

    Du coup j'ai construit mon Formulaire PersonneType comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      $builder
                ->add('nom', 'text', array('label'=>'Nom : ', 'required'=>true))
                ->add('prenom' , 'text', array('label'=>'Prénom : ', 'required'=>true))
     
                ->add('date_Naiss' , 'date', array('widget' => 'single_text',
                								'format' => 'dd/MM/yyyy',
                                                'data_timezone' => "Europe/Paris",
                                                'user_timezone' => "Europe/Paris"
                                                        )
                							)
                ->add('medical', new MedicalType())
                ->add('activites' , 'collection', array('type' => new ActiviteType() ,
                		'allow_add' => true ,
                		'allow_delete' => true ,
                		'by_reference' => false));
    Dans le Ajout.html.twig je suis parti pour personnaliser le formulaire. Donc j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    <div>
      <fieldset>
     
        <legend style="text-align: center;">Etat Civil</legend>
    	{{ form_label(form.nom) }}{{ form_widget(form.nom) }}
    	{{ form_label(form.prenom) }} {{ form_widget(form.prenom) }}
    	{{ form_label(form.date_Naiss) }}{{ form_widget(form.date_Naiss) }}
    	{{ form_label(form.sexe) }}{{ form_widget(form.sexe) }}
    	{{ form_label(form.statut) }}{{ form_widget(form.statut) }}	 
      </fieldset>
     
    </div>
    <div>
      <fieldset>
    	<LEGEND>Dossier médical</LEGEND>
    	 {{ form_label(form.medical.ete_urgence) }}{{form_widget(form.medical.ete_urgence) }}
    				</fieldset>
    </div>
     
    <h3>Activites</h3>
    <div id="activite">
      <a href="#" id="add_activite" class="btn">Ajouter une activité</a>
    	{{ form_widget(form.activites) }}
     
    </div>
    J'arrive comme vous le voyez à récupérer les infos de medical. Par contre, y' a pas moyens avec "activites"
    Dans mon entité "activite" j'ai "nom" et "type"

    que ce soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form.activitesnom) }}
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form.activites.activite.nom) }}
    rien ne fonctionne.

    J'ai bien fouillé dans la doc mais alors là, je ne vois pas la bétise que je fais.

    Si vous pouviez m'aider voir à me mettre sur la voie. Merci d'avance.
    Douter de tout, toujours, et surtout de soi-même...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    bonjour,

    vu que activites et une collection, il faut simplement faire une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {%for fieldActivite in form.activites%}
    {{ form_widget(fieldActivite.nom) }}
    //....
    {%endfor%}

  3. #3
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut Arnooo999,

    Je passé par cette manip' hier soir, mais elle ne fonctionne pas.

    Il y a un problème avec le "data-prototype" de la div générée.

    J'ai refais le truc en suivant un tuto, mais je ne trouve pas de solutions. Je pense qu'il va falloir que je triture le javascript. A mon avis il faut refaire le data-prototype, pour qu'il remplace les DIV par un tableau.
    Douter de tout, toujours, et surtout de soi-même...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    S'il s'agit de personaliser les items d'une collection de champs, consultes ces liens:
    http://www.developpez.net/forums/d12...ata-prototype/
    https://github.com/beberlei/AcmePizz...ndex.html.twig

    une autre solution étant d'utiliser le form theming afin que ActiviteType utilise son propre block twig (cela agira alors à la fois sur les items d'activité et sur le prototype de la collection).
    http://symfony.com/fr/doc/current/co...-pour-le-champ

  5. #5
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Slt Arnooo999,

    Excuse ma non réponse, mais j'étais parti en gros WE.

    je regarde tout cela et je te fais un retour. Voir je fais une mini explication pour les suivants
    Merci de ton aide
    Douter de tout, toujours, et surtout de soi-même...

  6. #6
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut à tous,

    En fait je dois être complètement débile, ou simplement siphonné du bulbe parce que je n'y arrive pas.

    Voici mon index.html.twig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    <table>
       <th>
    	<td>activités</td>
    	<td>Lieu</td>
    	<td>descriotif</td>
    	<td>suivi</td>
       </th>
       <tr id="rom_basebundle_indivtype_activites" data-prototype="{{ form_widget(form.activites.vars.prototype) | e }}">
    	{% for activite in form.activites %}
    	<td>{{ form_row(activite.lieu) }}</td>
    	<td>{{ form_row(activite.danger) }}</td> 
            <td>{{ form_row(activite.descriptif) }}</td>
            <td>{{ form_row(activite.suivi) }}</td>
             {% endfor %}
       </tr>
    </table>
     
     
    <input type="submit" class="btn btn-primary" />
    </form>
    	</div>
     
     
    <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    <script type="text/javascript">
    	$(document).ready(function(){
    		var container = $('#rom_basebundle_indivtype_activites');
     
    		function add_activite(){
    	// on compte le nombre de champs déja ajouté
    			index = container.children().length;
    			container.append($(container.attr('data-prototype').replace(/__name__/g, index)));
     
     
    	// On ajoute également un bouton pour pouvoir supprimer la 	catégorie
    			container.append($('<a href="#" id="delete_activite_' + index +'" class="btn btn-danger">Supprimer</a><br />'));
     
    	// On supprime le champ à chaque clic sur le lien de suppression
    			$('#delete_activite_' + index).click(function() {
             			$(this).prev().remove(); 
    				$(this).remove(); 
    				return false;
    			});
     
           }
     
     
    	// On ajoute un nouveau champ à chaque clic sur le lien d'ajout
    		$('#add_activite').click(function() {
    			add_activite();
    			return false;
    		});
     
     
       });
     
    </script>

    Ce code fonctionne en parti, mais je n'arrive pas à supprimer la collection de DIV injecter lors de l'ajout d'une activités. Du coup, mes champs ne rentrent pas dans le tableau.

    Je sais qu'il y a un truc que j'ai pas percuté, mais je n'arrive pas à savoir où.
    Pourtant j'ai décortiqué AcmePizza et surtout la doc. Mais................
    Douter de tout, toujours, et surtout de soi-même...

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Dans le PizzaBundle la sortie html qui représente le prototype n'est pas dans mise dans l'attribut data-prototype mais dans une balise script[type=html] dédié
    =>https://github.com/beberlei/AcmePizz...html.twig#LC36

    Il utilise également une macro pour ne pas avoir à dupliquer de code pour les items existant et pour le prototype
    - définition de la fonction macro=>https://github.com/beberlei/AcmePizz...html.twig#LC17
    - utilisation de la macro pour la sortie html du prototype=>https://github.com/beberlei/AcmePizz...html.twig#LC37
    - utilisation de la macro pour affichage des items existants=>https://github.com/beberlei/AcmePizz...html.twig#LC51

    coté Javascript, c'est donc le contenu de cette balise script qui est utilisé pour générer les nouvelles lignes
    =>https://github.com/beberlei/AcmePizz...html.twig#LC66

  8. #8
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    CA Y EST


    1) çà fonctionne (ce qui est bien)
    2) j'ai compris (ce qui est encore mieux)
    3) j'ai compris pourquoi je ne comprenais pas (là c'est Byzance)

    En fait j'essayais de faire un mixte entre la méthode de la doc et celui de la Pizza. D'ou effectivement des problèmes un peu partout.

    Merci beaucoup Arnooo999 ,
    tu as sauvé ce qui restait de mes cheveux.

    Tu n'aurais pas envie d'écrire un petit tuto sur les formulaires imbriqués, histoire de participer à la campagne de sauvegarde des cheveux sur les cranes.
    Douter de tout, toujours, et surtout de soi-même...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 25
    Points
    25
    Par défaut
    J'ai une question par rapports a ton formulaire :

    comment on fait si on veut que nom et prénom soient non modifiable ?

  10. #10
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut,

    Par définition, pour mes projets qui sont quasi exclusivement des bases de données, tous les champs doivent pouvoir être modifiables. Hormis les ID, mais ils ne sont pas visibles.

    D'après mes souvenirs de lecture, tu peux mettre dans ton constructeur de formulaire un attribut read_only => true (ou un truc comme cela).

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $builder->add('nom', 'text', array('label'=> 'Le nom : ', 'read_only'=>true));
    Je n'ai pas essayé ce que cela donne. Fais un retour
    Douter de tout, toujours, et surtout de soi-même...

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 25
    Points
    25
    Par défaut
    Ca marche mais cela reste un input


    Je vais bûcher sur les form et twig

    Merci


    Edit : {{ form.get('value').champs }}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/05/2011, 08h37
  2. [Form] Gestion des formulaires
    Par R1pToR dans le forum Struts 1
    Réponses: 5
    Dernier message: 10/07/2007, 15h47
  3. [Forms]accès à des formulaires Oracle via le WeB
    Par habasque dans le forum Forms
    Réponses: 8
    Dernier message: 17/05/2007, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo