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 :

Impossibilité d'accéder à un attribut d'un objet d'une collection dans un template Twig [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 Impossibilité d'accéder à un attribut d'un objet d'une collection dans un template Twig
    Bonjour,

    Dans un template de formulaire d'enregistrement d'une annonce, je tente d'accéder à un attribut d'un objet fils d'un objet faisant partie d'une collection appartenant à ladite annonce :

    Dans mon entité Advert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Price", mappedBy="advert", cascade={"persist"}, orphanRemoval=true)
         */
        private $prices;
    Dans mon entité Price :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Season", inversedBy="prices")
         * @ORM\JoinColumn(nullable=false)
         */
        private $season;
    Dans mon template twig, je boucle sur toutes les saisons, et pour chaque saison, je voudrais afficher tous les prix qui y correspondent :

    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
     
     
            {% for season in unique_seasons %}
     
                <h4>Saison {{ season.season }}</h4>
     
                {% for price in formPricesAdvert.prices %}
     
                    {% if price.season.id == season.id %}
     
                        <li>
                            {{ form_label(price.price, 'Prix', {'label_attr': {'class': 'foo'}}) }}
                            {{ form_errors(price.price) }}
                            {{ form_widget(price.price) }}
     
                            {{ form_label(price.duration, 'Durée', {'label_attr': {'class': 'foo'}}) }}
                            {{ form_errors(price.duration) }}
                            {{ form_widget(price.duration) }}
     
                            {{ form_label(price.season, 'Saison', {'label_attr': {'class': 'foo'}}) }}
                            {{ form_errors(price.season) }}
                            {{ form_widget(price.season) }}
     
                            <button type="button" class="btn-remove">
                                Supprimer cette durée
                            </button>
                        </li>
     
                    {% endif %}
     
                {% endfor %}
     
            {% endfor %}
    Il est à savoir que unique_season contient des entités de Season :

    Dans mon controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
            foreach ($advert->getPeriods() as $key => $value) {
     
                $seasons[] = $value->getSeason();
     
            }
     
            $unique_seasons = array_unique($seasons);
    ...
            return $this->render('road_trip/createPricesAdvert.html.twig', ['formPricesAdvert' => $formPrices->createView(), 'unique_seasons' => $unique_seasons,  'editMode' => $editMode,]);
    En exécutant ce code, j'obtiens l'erreur suivante :


    Neither the property "id" nor one of the methods "id()", "getid()"/"isid()"/"hasid()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView".
    Or, dans mon entité Season, j'ai bien une fonction qui me retourne l'id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
        public function getId(): ?int
        {
            return $this->id;
        }
    Quelqu'un aurait une idée de la manière dont je pourrais résoudre ceci?

    Merci d'avance pour votre aide

  2. #2
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Le problème n'est pas à chercher au niveau de ton entité : elle est au niveau de ton template twig.

    L'erreur t'indique qu'une méthode getId n'existe pas sur un objet de type FormView.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% for price in formPricesAdvert.prices %}
     
        {% if price.season.id == season.id %}
    Il y a fort à parier pour que price.season te retourne un FormView et non une entité.

  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 beaucoup pour ton intérêt.

    Je ne comprends pas bien ce qu'est le FormView... et comment je pourrais accéder à l'id de la saison dans mon prix...

  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
    Effectivement, c'est une FormView qui est retournée car lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    {{ price.season }}
    J'ai l'erreur suivante :


    An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Symfony\Component\Form\FormView could not be converted to string").

    Je ne vois pas comment tester la valeur de mon select qui contient l'id de la saison...

  5. #5
    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
    Bon, j'ai dû contourner le problème comme suit :

    Dans mon controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
            foreach ($advert->getPrices() as $price) {
     
                $idsSeasons[] = $price->getSeason()->getId();
            }
    ...
            return $this->render('road_trip/createPricesAdvert.html.twig', ['formPricesAdvert' => $formPrices->createView(), 'unique_seasons' => $unique_seasons, 'idsSeasons' => $idsSeasons,  'editMode' => $editMode,]);
    Et dans mon 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
     
     
            {% for season in unique_seasons %}
     
                {% set i = 0 %}
     
                <h4>Saison {{ season.season }}</h4>
     
                {% for price in formPricesAdvert.prices %}                
     
                    {% if idsSeasons[i] == season.id %}
     
                        <li>
                            {{ form_label(price.price, 'Prix', {'label_attr': {'class': 'foo'}}) }}
                            {{ form_errors(price.price) }}
                            {{ form_widget(price.price) }}
     
                            {{ form_label(price.duration, 'Durée', {'label_attr': {'class': 'foo'}}) }}
                            {{ form_errors(price.duration) }}
                            {{ form_widget(price.duration) }}
     
                            {{ form_label(price.season, 'Saison', {'label_attr': {'class': 'foo'}}) }}
                            {{ form_errors(price.season) }}
                            {{ form_widget(price.season) }}
     
                            <button type="button" class="btn-remove">
                                Supprimer cette durée
                            </button>
                        </li>
     
                    {% endif %}
     
                    {% set i = i + 1 %}
     
                {% endfor %}
     
            {% endfor %}

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

Discussions similaires

  1. [4.x] Twig : accéder à un attribut d'un objet d'un sous-formulaire
    Par dubitoph dans le forum Symfony
    Réponses: 6
    Dernier message: 16/01/2019, 21h44
  2. Accéder aux attribut d'un objet
    Par bakman dans le forum Services Web
    Réponses: 1
    Dernier message: 05/03/2013, 13h51
  3. [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
  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. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 19h01

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