Lorsque vous développez une application en utilisant un framework quelconque, vous vous retrouvez inévitablement à avoir un layout qui contient tout ce qui est censé être le design global de votre application.
Et parce qu’il faut des exceptions qui confirment la règle de ce design global, vous avez des pages qui doivent se comporter différemment :
Ne pas afficher le menu de gauche ou avoir un body avec une class différente.

Pour cela, Django et Symfony proposent deux concepts fortement intéressants qui sont similaires, bien qu’ayant des noms différents et que le concept soit beaucoup développé avec Django.
Je vais faire l’explication avec Django. Et je vous montrerai ensuite l’équivalent en PHP avec Symfony.

Avec Django

Dans votre layout, nous avons le code suivant :
<div>
  {% block 'menu' %}
    Contenu par défaut
  {% endblock %}
</div>

Et dans la vue de l’une de vos actions :
{% extend 'layout' %}
{% block 'menu' %}
  Contenu spécifique à la vue
{% endblock %}

Notre vue va charger le layout (celui à charger est précisé par le extend).
Le layout, en détectant le block va alors aller voir si la vue n’en définit pas un elle-même. Vu qu’elle en définit un, à l’endroit du block du layout sera affiché le contenu du block de la vue.

En gros ici, nous aurons le message « Contenu spécifique à la vue » d’affiché.
Si la vue ne définissait pas de block menu, nous aurions le message « Contenu par défaut d’affiché ».
Vous pouvez ainsi définir divers éléments de votre design spécifiques à votre vue tout en ayant également une valeur « par défaut ».

C’est d’ailleurs ainsi qu’il est conseillé de placer, en plus des éléments du design, le contenu de la vue en lui même, en créant un block « content ».
Plus plus d’informations, je vous invite à voir la documentation de Django.

Avec Symfony

Les slots de Symfony sont beaucoup moins utilisés que les blocks de Django. Il s’agit d’une fonctionnalité disponible dans les templates. Pas de la fonctionnalité autour de laquelle vous construisez vos templates.

Dans notre nous allons donc définir un slot dans notre layout :
<div>
  <?php if (has_slot('menu')): ?>
    <?php include_slot('menu') ?>
  
    Contenu par défaut
  
</div>

Et en redéfinir son contenu dans notre vue :
<?php slot('menu') ?>
  Contenu spécifique à la vue
<?php end_slot() ?>

Ou encore, si vous avez peu de contenu à définir dans votre slot :
<?php slot('menu', 'Contenu spécifique à la vue') ?>

Le première forme en fera tiquer certains puisqu’il s’agit d’un yield-like (pour les autres, c’est le genre de choses qui rendrait php encore mieux si c’était implémenté).
Le code donné ici fonctionne exactement de la même manière que celui donné plus haut pour Django.
Pour plus d’informations, je vous invite à voir la documentation Symfony.

Ainsi avec les slots et blocks à utiliser en fonction de la technologie que vous utilisez, vous pouvez rendre votre design entièrement DRY sans pour autant vous fixer de limites :)

Il y a quelques mois, Florent a eu une idée de génie !
Et comme il était dans les bureaux d’O2Sources lorsque cela est arrivé, il nous l’a faite partager et on a été tout de suite conquis.
Nous avons alors lancé un peu rapidement iSpoil, afin de dire « non » au mystère des films, séries et autres livres.
Parce que c’est nul, ça stresse et qu’on a envie de savoir qui c’est Keyser Söze avant la fin du film (ou pas).

Le design choisi était evidemment assez simpliste du fait d’un lancement rapide.
Mais c’est maintenant chose reglée puisque, grâce au travail acharné de Thanh et Hélène pour le design, de Florent pour l’intégration et de moi-même pour d’adaptation à Wordpress, le nouveau thème de iSpoil est disponible depuis ce matin.

Alors tout le monde à spoil !

O2Sources, l’agence web qui rox propose aujourd’hui (merci à Thanh) un nouveau thème gratuit pour Wordpress.
Nommé Pink Chinese, le bébé est en fait né il y a quelques mois, quasiment en même temps que Cyclo. Mais il n’est baptisé que aujourd’hui.

Plus léger que Cyclo, j’aime beaucoup ce nouveau thème :-)

Pendant ce temps la, j’ai vraiment hâte d’être riche !

 
Fork me on GitHub