Configurations Javascript dynamiques en Symfony
Attention : cet article a été rédigé en 2010, le contenu ou les éléments abordées peuvent être obsolète.
Dans cet article nous allons voir comment accéder à des données dynamiques provenant de symfony, en Javascript. Pour quelle raison ? Car il est parfois nécessaire depuis JS d’avoir à accéder à des données telles que : de l’i18n, des URLs générés à partir du routing, la culture de l’utilisateur, etc.
I18n pour le titre d’une modalbox par exemple, dont le site serait internationalisé. URLs pour des appels Ajax, où il est déconseillé de recopier l’URL en dur dans le fichier JS… Et la culture pour bien configurer certains JS qui proposent des fichiers de traductions.
Pour cela, je vous propose de préparer un tableau JSON, en voici un exemple :
Nous pouvons ainsi accéder à l’environnement, la culture de l’utilisateur, des URLs et de l’I18n. Maintenant, où placer ce JS ? 2 solutions s’offrent à nous :
- directement dans votre layout.php (via un partial ou component) ;
- dans un module > action avec un routing spécifique.
Personnellement je trouve plus propre la deuxième méthode même si elle est plus complexe à mettre en place ;)
C’est parti, nous créons donc un simpliste module nommé js
, associé à son action tout aussi simpliste configs
dont nous imposons le sf_format
à js
, soit un template nommé configsSuccess.js.php
.
Le routing correspondant :
Il ne reste plus qu’à inclure ce JS dans toutes nos pages. Pour cela nous pouvons utiliser le système d’événement de Symfony. Etant donné que j’ai besoin à la fois de la sfWebResponse
et de sfRouting
je vais passer par l’event context.load_factories
. Même si j’aurai préféré proposer un event plus approprié, car on a tendance à overused
cet event pour tout et n’importe quoi…
Vous pouvez placer ce code dans votre ProjectConfiguration
ou plutôt dans la configuration de votre application :
La configuration JS est dorénavant accessible, voici quelques exemples d’utilisation :
En allant plus loin, vous pouvez par exemple piloter les éditeurs wysiwygs de vos applications et cloisoner leurs configurations. Dans l’exemple ci-dessous, les boutons de l’éditeur sont configurés via le app.yml
, vous pouvez ainsi offrir une configuration différente pour vos applications.
De plus cela permet de centraliser des configurations pour éviter de se répéter (DRY) :
Voilà, qu’en pensez vous ? Utilisez vous des systèmes similaires ? Ou pas ? ;)