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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    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 : 321
    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')
    .

  3. #3
    Membre confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    321
    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 : 321
    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.

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

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