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 et render - Ne trouve pas la variable


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 21
    Points
    21
    Par défaut twig et render - Ne trouve pas la variable
    Bonjour,

    J'ai un petit souci sous symfony 2 + twig, je ne parviens pas à transmettre une variable à twig, via mon controleur.

    Code du contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	/**
    	 * Renvoie la liste des onglets (tabs)
    	 * @return array Liste des onglets
    	 */
    	public function getTabsNamesAction() {
    		$tabsNames = array('hop', 'hap', 'hup', 'hep', 'hip');
    		return $this->render('MyNewBundle:Front/FrontHtmlStructure/TabsStructure:DivTabsContainer.html.twig', array('tabsNames' => $tabsNames));
    	}
    Code du template DivTabsContainer.html.twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <div class="tabs">
    	<ul class="cf onglets">
    	{% for tabName in tabsNames %}
    		<li>{{ tabName }}</li>
    	{% endfor %}
    	</ul>
    </div>
    Erreur renvoyée par le framewok :
    Variable "tabsNames" does not exist in MyNewBundle::/Front/FrontHtmlStructure/TabsStructure/DivTabsContainer.html.twig at line 3
    j'ai cherché partout, j'ai l'impression d'être le seul à avoir ce problème, donc c'est probablement une erreur de ma part.
    Le contrôleur est bien chargé, et le template également.

    Si jamais vous voyez le problème, je planche dessus depuis presque deux heures, et là j'avoue je sèche ...

    note - je me suis basé sur cette documentation :
    http://symfony.com/doc/current/book/...ng-controllers

    Merci beaucoup de votre aide !

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    fais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for tabsNames in tabsNames %}

    et fais gaffe sur Twig $tabsName est un tableau

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Je ne comprends pas très bien ta réponse, mon retour étant tabsNames (le nom de la variable), je peux renommer chaque résultat tabName dans Twig non ?

    Néanmoins, j'ai copié / collé ton code pour voir, et ça ne fonctionne pas mieux, il me fait toujours la même erreur ...

    Edit:
    en fait avec copie de ton code, il me fait la même erreur sur la variable tabName ligne 5, que je corrige en tabsNames, et il me refait la même erreur qu'au début ligne 3 ...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    Depuis le controller tu as passer 'tabsNames' vers la vue.
    faut changer : {{ tabName }} en {{ tabsNames }} essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% for tabsNames in tabsNames %}
    		<li>{{ tabsNames }}</li>
    	{% endfor %}
    aprés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <li>{{ tabsNames.hop }}</li>
    Tu comprendra !!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Je viens de faire ton test en copier coller, même erreur. Du coup je check la doc, dans laquelle il est écrit ceci exactement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->render('AcmeArticleBundle:Article:recentList.html.twig', array('articles' => $articles));
    - articles est au pluriel, c'est le tableau en php.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% for article in articles %}
            {% include 'AcmeArticleBundle:Article:articleDetails.html.twig' with {'article': article} %}
        {% endfor %}
    - article au singulier correspond dans le template à une seule occurence de articles ($articles)

    A priori, si j'ai bien lu la doc, je me suis vraiment basé sur la méthode de travail conseillée. Ce qui me paraît gênant dans ton exemple (que j'ai testé tout de même), c'est l'appel à une récursive, du coup, vu qu'on modifie tabsNames dès le premier tour de boucle, j'ai l'impression que ça peut pas fonctionner ... Après c'est peut être particulier sous Twig, j'en sais rien.

    Merci de ton aide, mais désolé, ta solution me renvoie exactement la même erreur.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    détrompes toi !! Moi je fais tjrs for titi in titi pas de "s" pour le dernier et je n'ai jamais eu de soucis par ce que faudrait utiliser {{ titi }} meme chose par tout et c'est + facile.

    Et je viens d'essayer ton code, j'ai déclarer le tableau $tabsNames dans mon controlleur je passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'tabsNames' => $tabsNames
    ca marche dans ma vue :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     {% for tabsNames in tabsNames %}
    		<li>{{ tabsNames }}</li>
    	{% endfor %}

  7. #7
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    Bonjour,

    As-tu bien vérifié la casse entre ton contrôleur et ta vue (pas de 't' majuscule ou de 'n' minuscule) ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Bah pour le coup je sais pas du tout ce qui déconne ...
    Si quelqu'un a une idée, je me doutais que quelque chose marchait pas dans le framework, déjà y'a au moins une méthode qui paraît bizarre dans le fichier Template.php du bundle twig :

    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
        /**
         * Returns a variable from the context.
         *
         * This method is for internal use only and should never be called
         * directly.
         *
         * This method should not be overriden in a sub-class as this is an
         * implementation detail that has been introduced to optimize variable
         * access for versions of PHP before 5.4. This is not a way to override
         * the way to get a variable value.
         *
         * @param array   $context           The context
         * @param string  $item              The variable to return from the context
         * @param Boolean $ignoreStrictCheck Whether to ignore the strict variable check or not
         *
         * @return The content of the context variable
         *
         * @throws Twig_Error_Runtime if the variable does not exist and Twig is running in strict mode
         */
        final protected function getContext($context, $item, $ignoreStrictCheck = false)
        {
            if (!array_key_exists($item, $context)) {
                if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
                    return null;
                }
     
                throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist', $item));
            }
     
            return $context[$item];
        }
    Quand je var_dump sur le array_key_exists ça me renvoie bien True, et ça passe quand même dans le if ...
    Si, dans le if, je var_dump de $context[$item], il m'affiche bien mes valeurs, et item est bien égal à "tabsNames".

    Je continue sur la piste de l'erreur humaine, mais y'a peut être un problème de symfony avec wamp de windows. Enfin je suis incapable de dire à ce stade.

    Je reste preneur si vous pensez avoir une idée.

    Merci beaucoup !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Bon, j'ai pu constater que, pour une raison que j'ignore, la méthode que j'ai citée au message précédent est appelée deux fois avec mon paramètre tabsNames. J'ai vérifié mes render (c'était la première fois que j'en faisais un), je ne l'exécute nulle part ailleurs. J'ai fait une recherche dans tous mes fichiers via notepad ++, j'ai également fait une recherche dans mes contrôleurs.
    Donc la méthode est exécutée deux fois, mais la seconde fois qu'elle est exécutée, le contexte ne contient plus la variable "tabsNames" (j'ai constaté ça avec mon die quand on passe dans le !array_key_exists). Je suis incapable d'expliquer pourquoi, y'a peut être un truc dans ma config wamp qui craint, j'en ai aucune idée.
    Du coup, temporairement, je suis obligé de virer l'exception de la méthode, je retourne un null. Et là tout roule ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        final protected function getContext($context, $item, $ignoreStrictCheck = false)
        {
            if (!array_key_exists($item, $context)) {
                if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
                    return null;
                }
    			return null;
                throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist', $item));
            }
     
            return $context[$item];
        }
    Donc vu que c'est très très moche de faire ça, je veux bien l'avis de quelqu'un plus costaud que moi là dessus, je connais très mal symfony 2, donc je n'exclue pas la piste de l'erreur de ma part, c'est très clairement possible.

    Merci beaucoup !

    M.

  10. #10
    Membre habitué Avatar de Avrel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 118
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par aitiahcene Voir le message
    fais simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for tabsNames in tabsNames %}
    Surtout écoute pas ça , c'est de la connerie, il faut que tu différencie ton tableau de l'entrée sur laquelle tu te trouve, le code que tu as mis précédemment est correct et c'est la manière dont il faut procéder.

    Concernant ton erreur je vais me pencher dessus.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    peut importe la façon de le faire : la doc suggère de le faire comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for entity in entities %}
    Mais moi je ne fais pas le "s" a la fin

    Franchement lui au début il a fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% for tabName in tabsNames %}
    		<li>{{ tabName }}</li>
    	{% endfor %}
    c'est complètement faux !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Merci pour le coup de main. J'ai fini par identifier mon erreur, j'étendais un des templates parents, qui faisait un render de la même méthode.

    C'était bien une erreur humaine, du coup j'ai réglé ça en changeant légèrement l'architecture de mes templates.

    Concernant la syntaxe utilisée dans la boucle, effectivement j'aurais tendance à penser que symfony ne proposerait pas de faire ce genre de pratiques, car même si ça fonctionne, le jour ou ça déconne, bon courage pour le debuggage.

    Aitiahcene, la syntaxe que j'ai mise en place au départ est celle que j'ai reprise à la fin dans mon projet, et qui fonctionne actuellement ...

    doc : (articles as array)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for article in articles %}
    mon projet : (tabsNames as array)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for tabName in tabsNames %}
    J'espère que ça te servira aussi ; )

    Merci de votre aide à tous les deux.

  13. #13
    Membre habitué Avatar de Avrel
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 118
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par aitiahcene Voir le message
    peut importe la façon de le faire : la doc suggère de le faire comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for entity in entities %}
    Mais moi je ne fais pas le "s" a la fin

    Franchement lui au début il a fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% for tabName in tabsNames %}
    		<li>{{ tabName }}</li>
    	{% endfor %}
    c'est complètement faux !
    C'est absolument pas faux.

    Tu te trouve dans une boucle foreach, c'est a dire qu'à chaque occurrence de ton tableau tabsname, sa valeur sera inséré dans une variable tabname, et donc tu y accède bien avec tabname.

    Je te conseille sincèrement d’améliorer tes compétences dans le domaine du php et des langages de programmation en général avant de venir avancer des énormités telles que celle là à des gens qui ne sont pas forcement plus compétant que toi et en les lançant sur une mauvaise voie.
    Et comme j'aime aider mon prochain, je t'envoie lire ça :
    http://php.net/manual/fr/control-structures.foreach.php

  14. #14
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    Citation Envoyé par Avrel Voir le message
    Je te conseille sincèrement d’améliorer tes compétences dans le domaine du php et des langages de programmation en général avant de venir avancer des énormités telles que celle là à des gens qui ne sont pas forcement plus compétant que toi et en les lançant sur une mauvaise voie.
    Et comme j'aime aider mon prochain, je t'envoie lire ça :
    http://php.net/manual/fr/control-structures.foreach.php
    Merci #Avrel pour ton conseil et pour le lien

Discussions similaires

  1. Il ne trouve pas ma variable
    Par theo16 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 23/02/2014, 15h42
  2. verif, si la variable ne se trouve pas dans la bdd
    Par artichaudd dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2012, 13h51
  3. [MySQL] Update SQL qui ne trouve pas mes variables
    Par Actraiser dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 02/06/2011, 00h26
  4. [Kylix] [cgi] ne trouve pas libsqlmy.so.1 !
    Par Nepomiachty Olivier dans le forum EDI
    Réponses: 3
    Dernier message: 04/07/2002, 15h15

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