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] Imbrication de formulaires [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut [Form] Imbrication de formulaires
    Bonjour,

    je viens de commencer le développement d'une application en utilisant symfony2,

    J'ai suivi les tutoriels symfony de J. Place sur developpez.com.

    J'ai une relation ManyToMany entre l'entité dossierTrancport et l'entité Lot.

    je reviens vous pour m'aider à avancer.

    voici mon LotForm :

    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
     
    class LotForm extends AbstractType
    {
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {        
            $builder
                ->add('numeroLot', 'text')
                ->add('detailLot', 'text')
            ;
        }
     
    	public function setDefaultOptions(OptionsResolverInterface $resolver)
    	{
    	$resolver->setDefaults(array(
    	'data_class' => 'Isea\AgtsBundle\Entity\Lot'
    	));
    	}
     
     
        public function getName()
        {
            return 'lot';
        }
    voici mon DossierTransportForm:

    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
     
     
    class DossierTransportForm extends AbstractType
    {
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {        
            $builder
    			 ->add('client', 'entity', array(
    	            'class' => 'Isea\AgtsBundle\Entity\Client',
    	            'property' => 'nomSociete',
    	            'multiple' => false,
    	            'required' => false
                ))
                ->add('numeroContenair', 'text')
                ->add('numeroDocTransport', 'text')
    			->add('dateCreation', 'date')
    			->add('observation', 'text')
     
     
    			->add('lots', 'collection', array('type' => new LotForm(),
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false))
            ;
        }
     
    	public function setDefaultOptions(OptionsResolverInterface $resolver)
    	{
    	$resolver->setDefaults(array(
    	'data_class' => 'Isea\AgtsBundle\Entity\DossierTransport'
    	));
    	}
     
        public function getName()
        {
            return 'dossierTransport';
        }    
    }
    et voici la vue d'ajout:

    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
     
    <h1>Ajouter un dossier transport</h1>
    {% if message %}
    <p>{{ message }}</p>
    {% endif %}
     
    <form action="" method="post" {{ form_enctype(form) }}>
        {{ form_widget(form) }}
     
    <a href="#" id="ajouter_lot" class="btn">Ajouter un lot</a><br /><br />
     
        <input type="submit" />
    </form>
    <p><a href="{{ path('isea_dossierTransport_lister') }}">Retour à la liste des dossiers transport</a></p>
     
     
    <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function() {
     
    l'attribut « data-prototype » qui nous intéresse
    var $container = $('#isea_agtsbundle_dossierTransport_lots');
     
    function ajouter_lot() {
     
    index = $container.children().length;
     
     
    $container.append($($container.attr('dataprototype').
    replace(/__name__/g, index)));
     
    $container.append($('<a href="#" id="delete_category_' + index +
    '" class="btn btn-danger">Supprimer</a><br /><br />'));
     
    $('#delete_category_' + index).click(function() {
    $(this).prev().remove(); 
    $(this).remove(); 
    return false;
    });
    }
     
    if($container.children().length == 0) {
    ajouter_lot();
    }
     
    $('#ajouter_lot').click(function() {
    ajouter_lot();
    return false;
    });
    });
    </script>
    J'arrive à insérer les données d'un objet dossierTransport, mais pas ceux de l'objet lot, en faite le le formulaire FormLot ne s'affiche meme pas, lorsque je clique sur le lien "ajouter_lot" rien ne change.

    est ce la bonne manière d'appeler la fonction javascript?


    Merci d'avance.

  2. #2
    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 dans ta vue d'ajout à la ligne 29 tu as une erreur de frappe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $container.append($($container.attr('dataprototype')
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $container.append($($container.attr('data-prototype')
    .
    Douter de tout, toujours, et surtout de soi-même...

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Merci pour votre réponse,

    J'ai essayé avec votre proposition, mais sans grand changement.

    du coup j'étais sur la documentation de symfony: http://symfony.com/doc/current/cookb...llections.html

    et j'ai essayé avec l'exemple proposé:

    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
    59
    60
    61
    62
    63
    64
    65
     
    <h1>Ajouter un dossier transport</h1>
    {% if message %}
    <p>{{ message }}</p>
    {% endif %}
     
    <form action="" method="post" {{ form_enctype(form) }}>
        {{ form_widget(form) }}
     
    <ul class="tags" data-prototype="&lt;div&gt;&lt;label class=&quot;required&quot;&gt;__name__label__&lt;/label&gt;&lt;div id=&quot;dossierTransport_lots___name__&quot;&gt;&lt;div&gt;&lt;label for=&quot;dossierTransport_lots___name___numeroLot&quot; class=&quot;required&quot;&gt;Numerolot&lt;/label&gt;&lt;input type=&quot;text&quot; id=&quot;dossierTransport_lots___name___numeroLot&quot; name=&quot;dossierTransport[lots][__name__][numeroLot]&quot; required=&quot;required&quot; /&gt;&lt;/div&gt;&lt;div&gt;&lt;label for=&quot;dossierTransport_lots___name___detailLot&quot; class=&quot;required&quot;&gt;Detaillot&lt;/label&gt;&lt;input type=&quot;text&quot; id=&quot;dossierTransport_lots___name___detailLot&quot; name=&quot;dossierTransport[lots][__name__][detailLot]&quot; required=&quot;required&quot; /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;">
    </ul>
     
        <input type="submit" />
    </form>
    <p><a href="{{ path('isea_dossierTransport_lister') }}">Retour à la liste des dossiers transport</a></p>
     
     
    <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    <script type="text/javascript">
    // Get the ul that holds the collection of tags
    var collectionHolder = $('ul.tags');
     
    // setup an "add a tag" link
    var $addTagLink = $('<a href="#" class="add_tag_link">Add a tag</a>');
    var $newLinkLi = $('<li></li>').append($addTagLink);
     
    jQuery(document).ready(function() {
        // add the "add a tag" anchor and li to the tags ul
        collectionHolder.append($newLinkLi);
     
        // count the current form inputs we have (e.g. 2), use that as the new
        // index when inserting a new item (e.g. 2)
        collectionHolder.data('index', collectionHolder.find(':input').length);
     
        $addTagLink.on('click', function(e) {
            // prevent the link from creating a "#" on the URL
            e.preventDefault();
     
            // add a new tag form (see next code block)
            addTagForm(collectionHolder, $newLinkLi);
        });
    });
     
     
     
    function addTagForm(collectionHolder, $newLinkLi) {
        // Get the data-prototype explained earlier
        var prototype = collectionHolder.data('prototype');
     
        // get the new index
        var index = collectionHolder.data('index');
     
        // Replace '__name__' in the prototype's HTML to
        // instead be a number based on how many items we have
        var newForm = prototype.replace(/__name__/g, index);
     
        // increase the index with one for the next item
        collectionHolder.data('index', index + 1);
     
        // Display the form in the page in an li, before the "Add a tag" link li
        var $newFormLi = $('<li></li>').append(newForm);
        $newLinkLi.before($newFormLi);
    }
     
    </script>
    Avec ce code ça marche, sauf que j'ai pris un copier-coller du "data-prototype" du code source de la page.

    Je me demande comment trouver le nom de ce "data-prototype".

    Merci.

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    des idées s'il vous plait?


    je cherche à personnaliser mon sous-formulaires, pour l'afficher dans une seule ligne par exemple.


    Merci.

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    en relisant le sur la doc: http://symfony.com/doc/current/book/forms.html

    je viens des modifs::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <ul class="tags" data-prototype="{{form_widget(form.lots.vars.prototype)|e }}">
    {{ form_widget(form.lots)|e }}
    </ul>
    ça me génère pas d'erreur, mais le lien (javascript) ne permet pas d'ajouter les champs comme en utilisant une copie du source.

    mon objectif et de personnaliser l'affichage des champs de ce sous-formulaire et en essayant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {{ form_widget(form.lots.numLot)|e }} ou {{ form_widget(form.lots)|e }}
    ça n'affiche rien.

    Merci d'avance.

  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,

    regarde ma convers' avec arnooo999 qui portait sur le même sujet.
    http://www.developpez.net/forums/d13...s/#post7189442

    Et surtout regarde l'ensemble du PizzaBundle dont arnooo999 donne le lien.

    En fait, cette méthode est beaucoup plus simple que celle de la doc. Enfin ^perso moi je trouve.
    Douter de tout, toujours, et surtout de soi-même...

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    j'ai repris l'exemple de pizza pour faire le test avec.

    donc coté personnalisation du 2 éme formulaire, répond à ce que je cherchait.

    mais coté traitement, il y a un manque; je m'explique:

    Je prend la cas qui permet de ajouter une commande et ses lignes, je saisie les données, je fait un exemple avec 3 lignes de commande.

    Lors de la consultation ou affichage de la table order_item, je constate que seulement la 3éme ligne de commande qui est enregistré.

    Je me demande si vous n'avez pas rencontré ce cas et s'il y a une piste pour le traiter.


    Merci.

  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
    Pour moi, pas de problème d'affichage des données lors d'un appel à la base.

    Comme j'ai travaillé, aux petits oignons, mes relations entre tables et mes contraintes sont aussi vérifiées, je n'ai pas de problèmes.

    Mes "pizzas" sont toutes enregistrées et reviennent en fonction de l'id du "client".

    J'ai deux questions :
    1) Est-ce que l'enregistrement fonctionne bien sur une commande de trois pizzas? Apparaissent-elles toutes en BDD avec la ref du client ?
    2) tes relations entre les entités sont correctes ? ainsi que les contraintes ?
    Douter de tout, toujours, et surtout de soi-même...

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    au début j'ai essayé de personnaliser l'exemple selon mon besoin.

    pour pour tester j'ai crée un nouveau bundle et j'ai pris une copie du projet complet (avec la configuration des entités existante, qui me semble que sont bonne).

    mais le pb persiste tjrs.(une seule ligne de commande qui est enregistré au lieu de trois par exemple)

    juste pour info; la ligne enregistré c'est la dernière ajouté au formulaire.

    les changements que j'ai fait sont le remplacement du buildForm() par FormBuilderInterface dans les form-type.

    et la création du fichier routing.yml comme ceci:
    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
     
    acme_pizza_order_index:
      pattern: /order/
      defaults: { _controller: AcmePizzaBundle:Order:index }
     
    acme_pizza_order_list:
      pattern: /order/list
      defaults: { _controller: AcmePizzaBundle:Order:list }
     
    acme_pizza_order_show:
      pattern: /order/show/{id}
      defaults: { _controller: AcmePizzaBundle:Order:show }
     
    acme_pizza_order_delete:
      pattern: /order/delete/{id}
      defaults: { _controller: AcmePizzaBundle:Order:delete}
     
    acme_pizza_pizza_create:
      pattern: /pizza/create
      defaults: { _controller: AcmePizzaBundle:Pizza:edit }
     
    acme_pizza_pizza_update:
      pattern: /pizza/update/{id}
      defaults: { _controller: AcmePizzaBundle:Pizza:edit}
     
    acme_pizza_pizza_delete:
      pattern: /pizza/delete/{id}
      defaults: { _controller: AcmePizzaBundle:Pizza:delete}
     
    acme_pizza_pizza_list:
      pattern: /pizza/
      defaults: { _controller: AcmePizzaBundle:Pizza:list }
     
    acme_pizza_customer_list:
      pattern: /customer/
      defaults: { _controller: AcmePizzaBundle:Order:list }
    mais je pense que ça ne pourrait pas venir de ça.

    ce dernier test, je viens de la faire avec Symfony 2.2.0

    est ce que j'aurais du oublié certains choses?

    Merci.

  10. #10
    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,

    une seule ligne de commande qui est enregistré au lieu de trois par exemple
    As tu consulté ce qui est transmis du client au serveur?.
    Avec le Profiler de Symfony, onglet Request regarde si ce qui est transmis correspond à 1 ou 3 lignes.

    via Firebug consulte les attributs name de tes input afin de vérifier qu'il n'y a pas de doublons créés lorsque tu ajoutes une ligne de formulaire html.

  11. #11
    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 les deux.....


    J'ai trouvé le problème........

    EtudiantJ2EE je suppose que tu travailles avec symfony2, et pas une version inférieure. Du coup le problème réside dans la construction de ta vue.

    Dans l'exemple Pizza, on a ligne 66
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var row = $('script[type="text/html"]').text().replace(/\$\$name\$\$/g, index);

    En relisant, je ne sais pas pourquoi (Coup de génie) la doc de symfony, je suis rappelé que la variable $$name$$ s'appelait maintenant __name__.

    Du coup dans ton problème, il y a pas d'identification des différentes lignes avec le numéro de l'index. Chaque ligne à le même nom. Du coup Le persist se retrouve avec une seule info.

    Conclusion :
    Il faut modifier la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var row = $('script[type="text/html"]').text().replace(/\$\$name\$\$/g, index);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var row = $('script[type="text/html"]').text().replace(/__name__/g, index);
    Et là cela fonctionne impec....... Les lignes sont entrées avec le référencement à l'id de ta table principale.

    Voilou. Et ben j'ai bien mérité mon WE
    Douter de tout, toujours, et surtout de soi-même...

  12. #12
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    FadeToBlack ça marche avec cette proposition.

    j'en ai rencontré cette information il y a quelques jours dans la doc symfony ..........mais bon.


    arnooo999 merci, je n'utulise pas firebug, mais je viens de consulter et c'est intéressant... je vais voir par la suite.


    Merci beaucoup et bon weekend.

  13. #13
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    je reviens vers vous, pour m'eclaicir..........

    j'essaye d'appliquer l'exemple à mon cas, mais le lien pour ajouter (Add), ne s'affiche pas, j'ai répéte la comparaison entre les deux cas mais sans y arriver...

    ma template:

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    {% extends 'IseaAgtsBundle::layout.html.twig' %}
     
    {% block title %} {{ "dossierTransport.ajout" | trans }} {% endblock %}
     
    {% block content %}
     
    {% if message %}
    <p>{{ message }}</p>
    {% endif %}
     
    <form action="" method="post" {{ form_enctype(form) }} novalidate="novalidate">
     
    <table>
        <tr>
    	<td>{{ form_label(form.client)  }}</td>
    	<td>{{ form_label(form.numeroDocTransport) }}</td>
    	<td>{{ form_label(form.numeroContenair) }}</td>
    	<td>{{ form_label(form.dateSaisie) }}</td>
    	<td>{{ form_label(form.observation) }}</td>
        </tr>
        <tr>
    	<td>
    	{{ form_errors(form.client) }}
    	{{ form_widget(form.client) }}
    	</td>
    	<td>
    	{{ form_errors(form.numeroDocTransport) }}
    	{{ form_widget(form.numeroDocTransport) }}
    	</td>
    	<td>
    	{{ form_errors(form.numeroContenair) }}
    	{{ form_widget(form.numeroContenair) }}
    	</td>
    	<td>
    	{{ form_errors(form.dateSaisie) }}
    	{{ form_widget(form.dateSaisie) }}
    	</td>
    	<td>
    	{{ form_errors(form.observation) }}
    	{{ form_widget(form.observation) }}
    	</td>        
        </tr>
    </table>
     
     
        {% macro prototype(lot) %}
        <tr>
            <td>
                {{ form_widget(lot.numeroLot, { "empty_value": "" }) }}
                {{ form_errors(lot.numeroLot) }}
            </td>
            <td>
                {{ form_widget(lot.detailLot) }}
                {{ form_errors(lot.detailLot) }}
     
            </td>
            <td>
                <ul>
                    <li><a href="#">Add</a></li>
                    <li><a href="#">Remove</a></li>
                </ul>
            </td>
        </tr>
        {% endmacro %}
     
        <script type="text/html">
            {{ _self.prototype(form.lots.get('prototype')) }} {# dont know if it is the best way to access prototype #}
        </script>
     
        <table>
            <caption>{{ form_label(form.lots) }}</caption>
            <thead>
                <tr>
                    <th>numeroLot</th>
                    <th>detailLot</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                {% for key, lot in form.lots %}
                    {{ _self.prototype(lot) }}
                {% endfor %}
            </tbody>
        </table>
     
        {{ form_rest(form) }}{# form.lots's prototype is rendered twice #}
        {{ form_errors(form) }}
     
        <input type="submit" />
    </form>
     
    <script>
        /* add lots */
        var add = function() {
            var index = $('table tbody tr').length;
            var row = $('script[type="text/html"]').text().replace(/__name__/g, index);
            $('table tbody').append(row);
        };
     
        $('table tbody a').live('click', function(event) {
            if ($(this).text() === "Add") {
                add();
            }
            if ($(this).text() === "Remove") {
                $(this).closest('tr').remove();
            }
            event.preventDefault();
        });
     
        if ($('table tbody tr').length === 0) {
            add();
        }
    </script>
     
    {% endblock %}
    et les deux type-form que j'utilise:

    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
     
    class DossierTransportFormType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
     
    			->add('client', 'entity', array(
    			'label' => 'dossierTransport.client',
    	        'class' => 'Isea\AgtsBundle\Entity\Client',
    	        'property' => 'nomSociete',
    	        'multiple' => false,
    	        'required' => false
                ))
                ->add('numeroContenair', 'text', array('label' => 'dossierTransport.numeroContenair'))
    			->add('numeroDocTransport', 'text', array('label' => 'dossierTransport.numeroDocTransport'))
    			->add('dateSaisie', 'date', array('label' => 'dossierTransport.dateSaisie'))
    			->add('observation', 'text', array('label' => 'dossierTransport.observation'))
     
                ->add('lots', 'collection', array(
                    'type'         => new Type\LotType(),
                    'allow_add'    => true,
                    'allow_delete' => true,
                    'prototype'    => true,
                ));
        }
     
        public function getName()
        {
            return 'dossierTransport';
        }
    }

    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
     
    class LotType extends AbstractType
    {
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {        
            $builder
                ->add('numeroLot', 'text')
                ->add('detailLot', 'text')
            ;
        }
     
    	public function setDefaultOptions(OptionsResolverInterface $resolver)
    	{
    	$resolver->setDefaults(array(
    	'data_class' => 'Isea\AgtsBundle\Entity\Lot'
    	));
    	}
     
     
        public function getName()
        {
            return 'lot';
        }    
    }
    Merci.

  14. #14
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bjr,

    autrement, je ne rentre pas à la fonction "macro" https://github.com/beberlei/AcmePizz...html.twig#LC66

    aussi je me demande la variable item correspond à quoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      {% macro prototype(item) %}
    ;en faite je pense que c'est la collection qui est définie dans OrderType, mais celle-ci c'est (items) avec s.

    c'est bien ça? ou ça coresspon à autre chose?



    Merci.

  15. #15
    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
    Deux idées :

    1) tu as deux tables dans ton template. Du coup ne serait-ce pas utile de mettre un id sur le second pour la recherche du add ?
    2) dans ton body de la table ne serait-ce pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <tbody>
        {% for lot in form.lots %}
            {{ _self.prototype(lot) }}
         {% endfor %}
    </tbody>
    3) Personnellement, j'ai ajouté le "Add" dans le thead du tableau, histoire de ne pas l'avoir à chaque ligne. J'ai simplement un "remove" pour supprimer chaque ligne.
    J'ai donc changé le script en :
    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
    <script>
    $(document).ready(function(){
     
      var add = function() {
        var index = $('table tbody tr').length;
        var row = $('script[type="text/html"]').text().replace(/__name__/g, index);
     
        $('table tbody').append(row);
        };
     
      $('table tbody a').live('click', function(event) {
     
         if ($(this).text() === "Supprimer") {
               $(this).closest('tr').remove();
          }
            event.preventDefault();
        });
     
        $('table thead a').live('click', function(event){
           if ($(this).text() === "Ajouter") { add(); }
           event.preventDefault();
        });
     
        if ($('table tbody tr').length === 0) {add();}
     
    });
    </script>
    Douter de tout, toujours, et surtout de soi-même...

  16. #16
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Boniour,

    Merci pour votre réponse,

    Je viens de tester avec le code proposé (enlever le key), sans amélioration (Lien Add ne s'affiche pas).

    J'ai essayé sans la première table, et c'est pareil.


    merci.

  17. #17
    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
    Ta balise <a> n'apparait pas du tout, quelque soit l'endroit où tu la place ? ou sur le click il ne se passe rien ?

    N'aurais tu pas un pb de JS. Que te dit Firebug la-dessus ?
    Douter de tout, toujours, et surtout de soi-même...

  18. #18
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,


    Si je je place la balise en dehors de la fonction macro, le lien s'affiche.

    Je n'utilisais pas fireburg, je viens de lire une partie d'un tuto pour voir comment s'en servir......

    oui effectivement il y a une erreur dans le script.

    fireburg donne:
    ReferenceError: $ is not defined
    $('table tbody a').live('click', function(event) {

  19. #19
    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
    Bon on avance,

    concernant ton erreur, c'est sans doute parce que tu n'as pas intégré la bibliothèque Jquery ?

    Intègre là dans ton template ou dans le layout de base : ou as tu mis le corps de ta page ?
    dans la balise head
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    Perso j'ai construis le truc 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
    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
    {% macro prototype(activite)%}
        <tr>
            <td>
                {{ form_widget(activite.act_danger, { "empty_value": "" }) }}
                {{ form_errors(activite.act_danger) }}
            </td>
            <td>
                {{ form_widget(activite.lieu) }}
                {{ form_errors(activite.lieu) }}
            </td>
            <td>
                {{ form_widget(activite.descriptif) }}
                {{ form_errors(activite.descriptif) }}
            </td>
            <td>
                {{ form_widget(activite.suivi_social) }}
                {{ form_errors(activite.suivi_social) }}
            </td>        
            <td>
                <a href="#">Supprimer</a>
            </td>
        </tr>
        {% endmacro %}
     
        <script type="text/html">
            {{ _self.prototype(form.activites.get('prototype')) }}
        </script>
     
        <table>
            <caption>{{ form_label(form.activites) }}</caption>
            <thead>
                <tr>
                    <th>Activités</th>
                    <th>Lieu</th>
                    <th>Descriptif</th>
                    <th>suivi Social</th>
                    <th><a href="#">Ajouter</a></th>
                </tr>
            </thead>
            <tbody>
                {% for  activite in form.activites %}
                    {{ _self.prototype(activite) }}
                {% endfor %}
            </tbody>
        </table>
    Douter de tout, toujours, et surtout de soi-même...

  20. #20
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    juste pour construire d'abord un code simple qui fonctionne (je n’étends pas autre template)

    la Template:

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    <html>
    <head>
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script>
        /* add lots */
        var add = function() {
            var index = $('table tbody tr').length;
            var row = $('script[type="text/html"]').text().replace(/__name__/g, index);
            $('table tbody').append(row);
        };
     
         $('table tbody a').live('click', function(event) {
            if ($(this).text() === "Add") {
                add();
            }
            if ($(this).text() === "Remove") {
                $(this).closest('tr').remove();
            }
            event.preventDefault();
        });
     
        if ($('table tbody tr').length === 0) {
            add();
        }
    </script>
    </head>
    <body>
     
    <form action="" method="post" {{ form_enctype(form) }} >
     
     
        {% macro prototype(lot) %}
        <tr>
            <td>
                {{ form_widget(lot.numeroLot) }}
                {{ form_errors(lot.numeroLot) }}
            </td>
            <td>
                {{ form_widget(lot.detailLot) }}
                {{ form_errors(lot.detailLot) }}
     
            </td>
            <td>
                <ul>
                    <li><a href="#">Add</a></li>
                    <li><a href="#">Remove</a></li>
                </ul>
            </td>
        </tr>
        {% endmacro %}
     
        <script type="text/html">
            {{ _self.prototype(form.lots.get('prototype')) }} 
        </script>
     
        <table>
            <caption>{{ form_label(form.lots) }}</caption>
            <thead>
                <tr>
                    <th>numeroLot</th>
                    <th>detailLot</th>
                </tr>
            </thead>
            <tbody>
                {% for lot in form.lots %}
                    {{ _self.prototype(lot) }}
                {% endfor %}
            </tbody>
        </table>
     
        {{ form_rest(form) }}
        {{ form_errors(form) }}
     
        <input type="submit" />
    </form>
     
    </body>
    </html>
    là fireburg donne l'érreur:

    TypeError: $(...).live is not a function
    [Stopper sur une erreur]

    $('table tbody a').live('click', function(event) {

    pour utiliser JQuery, dois-je avoir cette bibliothèque dans un endroit du projet?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2.x] [Form] Imbrication de plusieurs formulaires et mélange du prototype
    Par FadeToBlack dans le forum Symfony
    Réponses: 13
    Dernier message: 16/04/2013, 14h37
  2. [2.x] [Form] Imbrication de formulaires
    Par dukoid dans le forum Symfony
    Réponses: 7
    Dernier message: 26/03/2013, 08h14
  3. [2.x] [Form] Imbrication de formulaires
    Par snake264 dans le forum Symfony
    Réponses: 0
    Dernier message: 13/03/2013, 13h08
  4. Dessiner des formes dans un formulaire
    Par karimspace dans le forum Access
    Réponses: 3
    Dernier message: 30/12/2005, 14h24
  5. [PEAR][HTML_QuickForm] Mise en forme d'un formulaire
    Par Norabfr dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 30/12/2005, 13h41

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