Bonjour à tous et à toutes,
Je précise avant toute chose que mon niveau en twig/symfony est proche de 0, d'où ma question sur ce forum.
Je vais essayer d'être le plus clair tout en étant le plus concis possible. Désolé si je n'y arrive pas.
Je travaille pour une société qui propose des portails informatiques à ses clients.
Sur ce portail, les clients peuvent créer différents types de contenus (articles, événements, dossier doc...)
Je suis (entre autres) chargé d'intégrer des pages personnalisées. Je travaille donc sur un fichier nom_page.html.twig où le HTML côtoie des variables twig.
Sur ces pages, il n'y a que moi qui ait accès au code ; les clients ne peuvent pas les modifier.
Et généralement, sur ces pages, on fait apparaitre des contenus créés par les clients.
Pour charger et afficher dynamiquement des éléments du portail sur ces pages, je fais appel à 2 types de variables :
- Des variables prédéfinies (ex : {{ menu_navigation|raw }} )
- Des variables personnalisées
Pour ces dernières, je dois, au préalable, les déclarer dans un fichier config.ini. Exemple :
1 2
| articlex.id = xxxxxx
articlex.format = array |
Ici xxxxxx correspond à l'ID de l'article, que je retrouve dans son URL. Exemple :
https://nom_du_portail.fr/node/content/nid/xxxxxx
Pour chaque élément de type "article" on a (entre autres) :
- Une vignette
- Un titre
- Une description courte
- Un contenu
- Une URL pour pouvoir accéder à cet article
- (éventuellement) Un tag
En indiquant article.format = array je place ces éléments dans un array.
Pour visualiser les propriétés de la variable articleX défini au format array je mets le code suivant dans mon fichier nom_page.html.twig :
<pre>{{ dump(articleX) }}</pre>
Et voici un exemple de ce que j'obtiens avec un article intitulé "Lupin" :
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
| array(49) {
["nid"]=>
string(6) "226952"
["nid_parent"]=>
string(6) "222706"
["did"]=>
string(4) "1125"
["uid"]=>
string(5) "59119"
["uid_moderator"]=>
string(5) "59119"
["type"]=>
string(7) "article"
["display_type"]=>
string(0) ""
["region"]=>
string(3) "tab"
["template"]=>
string(0) ""
["title"]=>
string(5) "Lupin"
["teaser"]=>
string(313) "<p><span>Il y a 25 ans, la vie du jeune Assane Diop est bouleversée lorsque son père meurt après avoir été accusé d'un crime qu'il n'a pas commis. Aujourd'hui, Assane va s'inspirer de son héros, Arsène Lupin, pour le venger.</span></p>
"
["description"]=>
string(0) ""
["enabled"]=>
string(1) "1"
["approval"]=>
string(1) "0"
["facet"]=>
string(0) ""
["created"]=>
string(10) "1612368665"
["updated"]=>
string(10) "1612368665"
["approved"]=>
string(10) "1612368665"
["published"]=>
string(1) "0"
["expired"]=>
string(1) "0"
["eventstart"]=>
NULL
["eventstop"]=>
NULL
["period"]=>
string(1) "0"
["scope"]=>
string(4) "this"
["url"]=>
string(0) ""
["max_count"]=>
string(1) "0"
["weight"]=>
string(2) "99"
["mail_to"]=>
string(0) ""
["form_options"]=>
NULL
["overview"]=>
string(1) "1"
["reader_profile"]=>
string(1) "0"
["moderator_profile"]=>
string(1) "0"
["contributor_profile"]=>
string(1) "0"
["theme"]=>
string(0) ""
["theme_layout"]=>
string(0) ""
["theme_color"]=>
string(0) ""
["seo_id"]=>
NULL
["seo_title"]=>
NULL
["seo_description"]=>
NULL
["cache_lifetime"]=>
string(1) "0"
["slide_speed"]=>
string(1) "0"
["slide_pause"]=>
string(1) "0"
["event_list"]=>
NULL
["object_type"]=>
string(0) ""
["object_id"]=>
NULL
["sort_by"]=>
NULL
["tags"]=>
array(1) {
[0]=>
array(9) {
["nid"]=>
string(6) "226952"
["tid"]=>
string(5) "24002"
["lid"]=>
string(4) "2562"
["weight"]=>
string(1) "1"
["value"]=>
string(8) "A la Une"
["color"]=>
NULL
["did"]=>
string(4) "1125"
["name"]=>
string(19) "Type d'évènements"
["types"]=>
string(12) "article
news"
}
}
["root"]=>
array(47) {
["nid"]=>
string(6) "226952"
["nid_parent"]=>
string(6) "222706"
["did"]=>
string(4) "1125"
["uid"]=>
string(5) "59119"
["uid_moderator"]=>
string(5) "59119"
["type"]=>
string(7) "article"
["display_type"]=>
string(0) ""
["region"]=>
string(3) "tab"
["template"]=>
string(0) ""
["title"]=>
string(5) "Lupin"
["teaser"]=>
string(313) "<p><span>Il y a 25 ans, la vie du jeune Assane Diop est bouleversée lorsque son père meurt après avoir été accusé d'un crime qu'il n'a pas commis. Aujourd'hui, Assane va s'inspirer de son héros, Arsène Lupin, pour le venger.</span></p>
"
["description"]=>
string(0) ""
["enabled"]=>
string(1) "1"
["approval"]=>
string(1) "0"
["facet"]=>
string(0) ""
["created"]=>
string(10) "1612368665"
["updated"]=>
string(10) "1612368665"
["approved"]=>
string(10) "1612368665"
["published"]=>
string(1) "0"
["expired"]=>
string(1) "0"
["eventstart"]=>
NULL
["eventstop"]=>
NULL
["period"]=>
string(1) "0"
["scope"]=>
string(4) "this"
["url"]=>
string(0) ""
["max_count"]=>
string(1) "0"
["weight"]=>
string(2) "99"
["mail_to"]=>
string(0) ""
["form_options"]=>
NULL
["overview"]=>
string(1) "1"
["reader_profile"]=>
string(1) "0"
["moderator_profile"]=>
string(1) "0"
["contributor_profile"]=>
string(1) "0"
["theme"]=>
string(0) ""
["theme_layout"]=>
string(0) ""
["theme_color"]=>
string(0) ""
["seo_id"]=>
NULL
["seo_title"]=>
NULL
["seo_description"]=>
NULL
["cache_lifetime"]=>
string(1) "0"
["slide_speed"]=>
string(1) "0"
["slide_pause"]=>
string(1) "0"
["event_list"]=>
NULL
["object_type"]=>
string(0) ""
["object_id"]=>
NULL
["sort_by"]=>
NULL
["tags"]=>
array(1) {
[0]=>
array(9) {
["nid"]=>
string(6) "226952"
["tid"]=>
string(5) "24002"
["lid"]=>
string(4) "2562"
["weight"]=>
string(1) "1"
["value"]=>
string(8) "A la Une"
["color"]=>
NULL
["did"]=>
string(4) "1125"
["name"]=>
string(19) "Type d'évènements"
["types"]=>
string(12) "article
news"
}
}
}
["image"]=>
string(98) "https://nom_du_portail.fr/data/nom_du_portail.fr/application/node/226952/thumb.jpg"
} |
Grâce à ça, je sais, par exemple, que si je veux afficher la vignette de mon articleX, je dois entrer le code suivant :
<img src="{{ articlex.image|raw }}" alt="Vignette de l'article X" />
Le problème de cette méthode (où je dois déclarer mes variables dans config.ini) c'est que, comme nos clients n'ont pas accès/ne peuvent pas modifier ces pages personnalisables, si nos clients veulent afficher autre chose (vignette, titre, description courte...) en lieu et place d'articleX sur la page, il faut qu'ils éditent articleX (le conteneur) et qu'ils modifient le contenu de cet article (ça ils peuvent le faire).
C'est comme si j'avais une armoire (=ma page) avec des boites transparentes (=mes articles) (inamovibles) avec des objets à l'intérieur (= la vignette de l'article, le titre, la description courte...). Si je veux qu'on voit autre chose dans mes boites, et comme ces boites sont inamovibles, je suis obligé d'ouvrir mes boites et changer les objets qui s'y trouvent.
Pour rendre la chose plus dynamique, je me suis dit qu'il fallait une sorte de "bouton" on/off sur mes articles (pas seulement articleX) de façon à afficher/masquer mon/mes article(s) sur ma page. Et pour que ce soit relativement simple pour le client, j'ai pensé à un tag intitulé "A la une".
Pour info, en visualisant les propriété de la variable articleX défini au format array (voir mon exemple plus haut), j'ai vu comme quoi la propriété qui correspond au tag apparaissait sous le nom "value".
1 2
| ["value"]=>
string(8) "A la Une" |
Donc "théoriquement" (parce que ça ne fonctionne pas, je ne sais pas pourquoi) si je veux afficher le tag attribué à articleX, je suis censé écrire :
(Sauf que rien ne s'affiche )
En cliquant sur le tag "A la une" de mon article, je me suis rendu compte que j'arrivais sur une page (avec cet url : https://nom_du_portail.fr/node/tag/tid/24002) sur laquelle sont affichés tous les articles avec ce tag "A la une"
J'ai donc voulu voir ce que cette page avait "dans le ventre". J'ai donc déclaré ma variable dans config.ini :
1 2
| alaune.id = 24002
alaune.format = array |
Puis j'ai mis le code suivant dans ma page nom_page.html.twig
<pre>{{ dump(alaune) }}</pre>
Seulement j'ai eu pour seul résultat :
Savez-vous pourquoi :
- Rien ne s'affiche quand je mets {{ articlex.value }} ?
- J'obtiens NULL quand je mets <pre>{{ dump(alaune) }}</pre> ?
Sinon, et puisque je ne connais pas leur ID à l'avance, comment écrire une condition Twig, de façon à afficher dynamiquement (simplement en ajoutant/supprimant le tag "A la une") tous les éléments (dans mon exemple c'est des articles) qui ont donc le tag "A la une" ?
J'espère avoir été clair dans mes (trop longues) explications.
Merci de m'avoir lu jusqu'ici et merci par avance pour vos réponses
Bonne journée
Partager