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 :

Formulaire sur collection - Doctrine - CreateForm [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Septembre 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Septembre 2014
    Messages : 45
    Points : 43
    Points
    43
    Par défaut Formulaire sur collection - Doctrine - CreateForm
    Bonjour à tous,

    Je suis en plein apprentissage de symfony.

    J'ai une entité Commune dont l'un des attributs (transports) récupère par une relation de type OneToMany celle de type ManyToOne initiée dans mon entité Transport. L'attribut Transport de Commune est donc une collection.

    Je cherche à afficher dans le CommuneType(formulaire) le sous-formulaire TransportType, y compris quand la collection est vide. J'ai suivi pour réaliser cela un tuto. Ceci dit la commande console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php app/console doctrine:generate:entyties MonBundle
    m'avait permis de faire la même chose.

    L'affichage du sous formulaire dans ma vue est fonctionnelle lorsque la collection est hydraté. Par contre et c'est mon souci, comment faire apparaître les mêmes champs mais lorsque la collection est vide ?

  2. #2
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Bonjour,

    Il va falloir utiliser allow add et les prototypes. A moins que je n'ai pas compris la question.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Septembre 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Septembre 2014
    Messages : 45
    Points : 43
    Points
    43
    Par défaut
    Merci pour ta réponse.

    Alors dans mon builder form j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ->add('transports', 'collection', [
                            'type' => new TransportType,
                            'allow_add' => true,
                            'allow_delete' => true
                    ])
    Dans le DOM de ma vue, j'ai bien le formulaire qui est créé mais il reste sous la forme de l'attribut data-prototype...

  4. #4
    Membre confirmé
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Points : 516
    Points
    516
    Par défaut
    Salut,

    Excuse moi mais je ne comprends pas bien ton problème. Tu n'arrives pas à faire quoi ? Afficher un champ de type Collection ?

    Si c'est ça, tu dois :
    1. Définir un formulaire correspondant à l'entité de ton champ Collection. Ce que tu as fais : c'est le TransportType qui par exemple est composé de deux champs : nom (input) et type (select).
    2. Définir ton champ Collection comme tu l'as fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $builder->add('transports', 'collection', array(
        'type' => new TranportType(),
        'allow_add' => true,
        'allow_delete' => true,
        'prototype' => true
    ));
    3. Un peu de javascript par dessus pour ajouter/supprimer des items dans ta collection
    4. Personnaliser le rendu de ton formulaire TransportType avec un template twig.
    M. Lebowski : Avez-vous un emploi, monsieur ?
    Le Duc : Un emploi ?
    M. Lebowski : Ne me dites pas que vous cherchez un emploi dans cette tenue un jour de semaine ?
    Le Duc : Un jour de… Quel jour on est ?

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Septembre 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Septembre 2014
    Messages : 45
    Points : 43
    Points
    43
    Par défaut
    Je viens d'avancer un peu sur le sujet et sur les prototypes...
    J'ai expérimenté 2 façons de faire.

    La première utilise les prototypes et si j'ai bien compris un script jQuery qui permet de recopier le champ data-prototype dés que l'on clique sur un bouton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $('a.transport_add').on('click', function(event){
          event.preventDefault();
          var collectionHolder = $('#commune_transports');
          var prototype = collectionHolder.attr('data-prototype');
          form = prototype.replace(/\$\$name\$\$/g, collectionHolder.children().lenght);
          collectionHolder.append(form);
        });
    J'ai également ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $commune->getTransports()->add(new Transport($commune));
    au début de mon controleur.

    Enfin pour la mise en forme, j'utilise Bootstrap et ai rajouté cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    form:
            resources: ['bootstrap_3_horizontal_layout.html.twig']
    dans /app/config/config.yml sous la section Twig.

    Avec la seconde on perd l'avantage d'utiliser Doctrine donc je n'en parle pas.

    Sujet résolu ? Selon vous ? Pour ma part globalement oui.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/08/2005, 10h01
  2. Controle de formulaire sur l'envoi
    Par navis84 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/08/2005, 17h23
  3. Réponses: 8
    Dernier message: 22/03/2005, 15h06
  4. Ouverture formulaire sur enregistrement precis
    Par mat_lefebvre dans le forum IHM
    Réponses: 7
    Dernier message: 11/10/2004, 15h37
  5. [VB.NET] [PPC] Comment faire un formulaire sur pls pages?
    Par papy27 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 03/06/2004, 17h23

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