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 :

Twig : accéder à un attribut d'un objet d'un sous-formulaire [4.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut Twig : accéder à un attribut d'un objet d'un sous-formulaire
    Bonjour,

    J'ai un formulaire "AdvertType" qui fait appel à un sous formulaire "VehicleType" qui lui-même contient un champ de type "EntityType" que je voudrais scinder en deux groupes de cases à cocher dans mon template.

    Voici le code probant dans "AdvertType" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    class AdvertType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
    ...
                ->add('vehicle', VehicleType::class)
    ...
    Celui dans "VehicleType" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    class VehicleType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
    ...
                ->add('equipments', EntityType::class, array('class' => 'App\Entity\Equipment', 'multiple' => true, 'expanded' => true, 'choice_label' => 'equipment',))
    ...
    Et voici ce que je fais dans le template twig pour tenter d'afficher les équipements en fonction de leur appartenance (catégorie) :

    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
     
    ..
            {{ form_errors(formAdvert.vehicle.equipments) }}
            {{ form_label(formAdvert.vehicle.equipments, 'Equipement du porteur', {'label_attr': {'class': 'foo'}}) }}
            {% for equipment in formAdvert.vehicle.equipments if equipment.belonging == 'Porteur' %}
     
                {{ form_row ( equipment ) }}
     
            {% endfor %}
     
            {{ form_errors(formAdvert.vehicle.equipments) }}
            {{ form_label(formAdvert.vehicle.equipments, 'Equipement de la cellule', {'label_attr': {'class': 'foo'}}) }}
            {% for equipment in formAdvert.vehicle.equipments if equipment.belonging == 'Cellule' %}
     
                {{ form_row ( equipment ) }}
     
            {% endfor %}
    ...

    Lors de la génération du template, j'obtiens l'erreur :

    Neither the property "belonging" nor one of the methods "belonging()", "getbelonging()"/"isbelonging()"/"hasbelonging()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView".
    Je suppose que ça provient de ma condition if qui accède à la valeur d'un attribut d'un objet embarqué dans un formulaire lui-même embarqué.

    Quelqu'un aurait une idée de la manière de procéder pour réaliser ce que je voudrais?

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Salut,

    Je connais assez peu Symfony/Twig mais d'après le message d'erreur ça semble venir soit :
    - que chacun des "equipment" qui se trouvent dans "formAdvert.vehicle.equipments" n'a pas de "propriété "belonging" (tu devrais pouvoir vérifier ça en dumpant le contenu les données que tu parcours)
    - que la propriété "belonging" ou les méthodes pour y accéder ont une visibilité insuffisante pour accéder à la valeur

    Si jamais ça peut t'aider un peu... bon courage !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Merci pour ton aide.

    Mon entité "Equipment" a bien un attribut "belonging" et une méthode publique "getBelonging", mais qui ne sont pas accessibles depuis le template. Je ne comprends pas pourquoi.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    N'y aurait-il pas la possibilité de travailler avec un champ non mappé?

    J'ai effectué ceci dans mon builder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                ->add('equipments', EntityType::class, array('class' => 'App\Entity\Equipment', 'multiple' => true, 'expanded' => true, 'choice_label' => 'equipment',
                      'query_builder' => function(EquipmentRepository $er) use ($belongingCarrier) {
                                            return $er->queryFindByBelonging($belongingCarrier);
                                         }            
                                                                    )
                     )            
                ->add('equipmentsCell', EntityType::class, array('class' => 'App\Entity\Equipment', 'multiple' => true, 'expanded' => true, 'choice_label' => 'equipment',
                      'mapped' => false,  
                      'query_builder' => function(EquipmentRepository $er) use ($belongingCell) {
                                            return $er->queryFindByBelonging($belongingCell);
                                         }            
                                                                    )
                     )
    Et ceci dans mon template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            {{ form_errors(formAdvert.vehicle.equipments) }}
            {{ form_label(formAdvert.vehicle.equipments, 'Equipement du porteur', {'label_attr': {'class': 'foo'}}) }}
            {{ form_widget(formAdvert.vehicle.equipments) }}
     
            {{ form_errors(formAdvert.vehicle.equipmentsCell) }}
            {{ form_label(formAdvert.vehicle.equipmentsCell, 'Equipement de la cellule', {'label_attr': {'class': 'foo'}}) }}
            {{ form_widget(formAdvert.vehicle.equipmentsCell) }}
    Tout s'affiche correctement, comme voulu. Cependant, dans mon controller, je ne parviens pas à accéder aux données de "equipmentsCell". Lorsque je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            if ($form->isSubmitted() && $form->isValid()) 
            {
                $equipmentsCell = $request->request->get("equipmentsCell");
                var_dump($equipmentsCell);
    J'obtiens l'affichage de null.

  5. #5
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Je dis peut-être une connerie mais est-ce qu'il ne manquait pas tout simplement un Form de l'entité App\Entity\Equipment ?

    Car dans VehicleType tu déclarais bien un champ "equipments" de type "App\Entity\Equipment", mais je ne vois pas comment Symfony peut comprendre "ce qu'il doit générer comme code HTML pour afficher à cet endroit là un champ de type "Equipment". Est-ce que quelque chose m'échappe ou ça fait sens ?

    En faisant des recherches je suis tombé là-dessus : https://symfony.com/doc/current/form/embedded.html et https://symfony.com/doc/current/form...llections.html
    Est-ce que ça s'applique à ta situation ? Si oui est-ce que les Entity et tes Types que tu utilises implémentent ce qui est décrit dans la doc ?

    Enfin je suis tombé là-dessus aussi : https://blog.martinhujer.cz/symfony-...quest-objects/
    Je n'ai pas saisi toute la subtilité du propos mais peut-être que ça pourra te donner des idées pour trouver une solution à ton problème.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Par défaut
    Merci beaucoup pour ton intérêt.

    Les embedded forms servent à alimenter des entités. Or, mon but n'est pas de créer des nouveaux records mais bien d'avoir les records déjà créés sous forme de cases à cocher.

    Via un autre forum, quelqu'un m'a mis sur la piste d'une solution que j'ai mis en oeuvre de cette façon :

    j'ai créé une propriété carrierEquipment et un autre cellEquipment dans mon entité Vehicle. Toutes deux sont une collection d'entités Equipment qui elle à toujours sont attribut belonging.

    Dans mon builder, j'ai mes deux attributs qui sont liés chacun à une requêtes qui l'une, ramène que les équipements liés au porteur et l'autre uniquement ceux liés à la cellule.

    Dans mon template, je peux alors afficher chacun des contenus séparément.

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

Discussions similaires

  1. Accéder aux attribut d'un objet
    Par bakman dans le forum Services Web
    Réponses: 1
    Dernier message: 05/03/2013, 13h51
  2. [POO] Accéder à un attribut d'un objet via une variable
    Par iLoLo21 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/11/2008, 12h36
  3. Créer 1 ref à 1 objet d'1 sous-formulaire
    Par alonsyl dans le forum VBA Access
    Réponses: 1
    Dernier message: 11/09/2007, 20h02
  4. [SimpleXML] Accéder aux attributs d'un objet
    Par DeezerD dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 28/08/2007, 16h39
  5. Acces aux objets dans un sous-formulaire
    Par Destiny dans le forum Access
    Réponses: 3
    Dernier message: 13/02/2007, 08h28

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