Problème
Imaginons que vous vouliez stocker le contenu d'un champ de type bloc XML dans une variable javascript.
D'habitude, on affiche le champ de cette manière dans le template :
{attribute_view_gui attribute=$node.data_map.description}
D'autre part, si on veut échapper une chaîne pour pouvoir sans risque l'utliiser en javascript,
on utiliser la fonction de template wash().
Pas facile à première vue de concilier les deux.
Solution
Stockez le rendu de votre bloc XML dans une variable :
{set-block variable=$description}
{attribute_view_gui attribute=$node.data_map.description}
{/set-block}
Échappez la variable pour pouvoir utiliser son contenu dans du code javascript :
<script>
jsVar = "{$description|trim()|wash('javascript')}";
</script>
Remarque :
Si la variable contient des retours à la ligne, cela causera des erreurs. Pour cela on peut créer un opérateur de template qui recherchera et supprimera tous ces retours à la ligne.
/**
* Supprime tous les retours à la ligne.
* Cette fonction est utile pour injecter du code html généré par un template dans du javascript. (exemple : dans une infobulle Google Map)
* @param string $string Chaîne à nettoyer
*/
public static function removeWraps( $string ) {
$string = str_replace( '\r\n', '', $string );
$string = str_replace( '\n', '', $string );
$string = str_replace( '\r', '', $string );
$string = str_replace( CHR( 10 ), '',$string );
$string = str_replace( CHR( 13 ), '', $string );
return $string;
}