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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<pre>{{ dump(articleX) }}</pre>
Et voici un exemple de ce que j'obtiens avec un article intitulé "Lupin" :
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
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&eacute;e lorsque son p&egrave;re meurt apr&egrave;s avoir &eacute;t&eacute; accus&eacute; d'un crime qu'il n'a pas commis. Aujourd'hui, Assane va s'inspirer de son h&eacute;ros, Ars&egrave;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&eacute;e lorsque son p&egrave;re meurt apr&egrave;s avoir &eacute;t&eacute; accus&eacute; d'un crime qu'il n'a pas commis. Aujourd'hui, Assane va s'inspirer de son h&eacute;ros, Ars&egrave;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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<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".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
alaune.id = 24002
alaune.format = array
Puis j'ai mis le code suivant dans ma page nom_page.html.twig
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<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