Retour à la documentation développeur

Développer avec Smartyer

Smartyer est le moteur de templates (vues) que nous utilisons.

Dans un développement orienté MVC (Modèle-Vue-Contrôleur), Smartyer est ce qui permet l'affichage des vues depuis le contrôleur.

Smartyer

Smartyer une version plus légère et plus simple de Smarty, compatible avec les anciens moteurs Template_Lite et Dwoo notamment.

Techniquement il n'a que peu de différences avec Smarty et la documentation de Smarty s'y applique globalement, sauf les différences suivantes :

Exécution de code PHP

Smartyer autorise l'exécution de code PHP inclus dans un fichier Smartyer, c'est le résultat du fait que les instructions Smartyer sont remplacées par du code PHP, et que ce fichier généré est ensuite directement exécuté.

C'est un choix de design, qui permet de garder le moteur Smartyer simple, et de permettre d'intégrer du PHP si on a besoin de faire des choses plus complexes. Mais normalement dans les vues (ou templates) on ne doit pas faire de choses particulièrement complexes, toute la complexité doit être dans le modèle et le contrôleur. Cependant pour certains besoins spécifiques, c'est assez pratique.

Un exemple de code PHP + Smartyer combiné possible serait :

{foreach from=$membres item="membre"}
<?php
$class = ($membre->statut === "Président") ? 'chef' : 'membre';
?>
    <h2 class="{$class}">{$membre.nom}</h2>
{/foreach}

Le résultat de ce choix de design est qu'il est possible d'exécuter n'importe quel code PHP à l'intérieur d'un template Smartyer.

Sécurité !

De ce fait, il est strictement interdit de permettre à un non-développeur de modifier un template Smartyer.

Exemple d'utilisation interdite : édition ou génération de template Smartyer depuis un plugin Paheko. Le risque dans ce cas est, en cas de faille, qu'un attaquant puisse faire exécuter du code PHP dans une installation Paheko.

Échappement automatique des variables

Exemple : si $nom vaut <b>Test, {$nom} retournera &lt;b&gt;Test.

C'est une mesure de sécurité automatique qui permet d'empêcher l'injection HTML/CSS.

Pour désactiver l'échappement automatique (avec des variables ne contenant que des choses dont on est absolument sûr du contenu !), utiliser le modificateur raw : {$nom|raw}

Pour utiliser un échappement différent, utiliser le modificateur escape qui remplace l'échappement automatique : <a href="/page.php?nom={$nom|escape:"url"}">

A noter que cet échappement ne s'applique qu'aux variables affichées directement par Smartyer, les fonctions utilisateur doivent échapper elle-même les variables reçues en paramètres.

Variables dans les chaînes de de caractère

Il n'est pas possible d'intégrer des variables à l'intérieur de chaînes de caractère (contrairement à Smarty).

Exemple : {fonction_test argument="Coucou $nom !"} passera Coucou $nom ! à la fonction, mais pas Coucou Anouk !.

Pour remplacer des variables à l'intérieur de chaînes de caractère, utiliser le modificateur args (alias de la fonction PHP sprintf.

Par exemple : {fonction_test argument="Coucou %s !"|args:$nom}.

Référence des variables définies par défaut

  • www_url
  • admin_url
  • help_pattern_url
  • help_url
  • admin_url
  • self_url
  • self_url_no_qs
  • session
  • is_logged
  • logged_user
  • dialog

Fonctionnalités non supportées

  • Modificateur escape : le second argument du jeu de caractère n'est pas supporté. Le premier argument supporte également json comme type d'échappement, permettant de transformer une variable en structure JSON.
  • Fichiers de configuration
  • Variables réservées de type {$smarty....}
  • Système de cache
  • Opérations mathématiques de type {$numero+3}

Fonctions non supportées

{capture}
{config_load}
{include_php}
{insert}
{php}
{section},{sectionelse}
{strip}

{counter}
{cycle}
{debug}
{eval}
{fetch}
{html_checkboxes}
{html_image}
{html_options}
{html_radios}
{html_select_date}
{html_select_time}
{html_table}
{mailto}
{math}
{popup}
{popup_init}
{textformat}

Modificateurs non supportés

capitalize
count_characters
count_paragraphs
count_sentences
count_words
default
indent
lower
spacify
string_format
strip
strip_tags
upper
wordwrap

Ils peuvent être implémentés facilement au besoin. Par exemple :

$tpl = Template::getInstance();
$tpl->register_modifier('wordwrap', 'wordwrap');