Boire ou coder ... Pourquoi choisir?
Publié le 24 septembre 2009 22:00

Rails : étendre le système de templates

En ce moment, je regarde beaucoup comment fonctionne Shopify. A défaut d'avoir une boutique sur laquelle faire quelques tests, je regarde les divers outils extraits de l'application et dont le code a été ouvert. Vous pouvez en voir la liste sur github. Aujourd'hui je voudrais vous parler de l'un de ceux-ci, Liquid.

Utilisé par Shopify pour mettre en place un système de templating sécurisé, n'autorisant pas l'exécution de code ruby, l'outil est assez impressionnant de par son utilisation. Les habitués de Django naviguent en terrain connu. Mais c'est bien du Ruby.

<ul id="products">
    {% for product in products %}
        <li>
            <h2>{{product.title}}</h2>
            Only {{product.price | format_as_money }}
            <p>{{product.description | prettyprint | truncate: 200  }}</p>
        </li>
    {% endfor %}
</ul>

Comme vous pouvez le constater, nous pouvons parcourir des éléments et en afficher les valeurs sans problème. Pour une documentation détaillée de Liquid, je vous invite à voir la documentation de Shopify.

Quant à la définition côté code, ce n'est pas beaucoup plus compliqué.

Liquid::Template.parse(read_template).render 'products' => Product.find(:all)

Et si vous avez une application Rails (comme je suppose que c'est le cas), c'est d'autant plus simple. Il suffit de redéfinir le "handler" de vue par celui de Liquid. Dans votre fichier config/environment.rb, ajoutez le snipper suivant :

ActionView::Base::register_template_handler :liquid, LiquidView

Auquel cas vous n'avez pas à parser vous même le contenu (Liquid::Template.parse est inutile). C'est fait automatiquement avec les variables que vous avez défini. Tous vos templates utiliseront ainsi Liquid. Les tags <% ne seront plus valides. Attention cependant ne commencez pas à intégrer Liquid dans toutes vos applications rails en vous disant que cela sera plus fun. Liquid est très sympa lorsque le code de vos templates est susceptible d'être modifié par un utilisateur tiers. Cependant votre application y perdra inévitablement en rapidité.

Bien évidemment si vous avez besoin de Liquid, cela signifie que vos utilisateurs peuvent modifier les vues rendues par votre application. Dans ce cas je vous conseille fortement l'utilisation de theme support afin de gérer ceux-ci. Son utilisation est également particulièrement simple.

Au lieu d'avoir directement vos vues et fichier publiques dans le répertoire views, aurez un répertoire "themes" contenant chacun de ces thèmes et ses vues ainsi que les fichiers publics.

$app_root
    themes/
        [theme_name]
            images/
            stylesheets/
            javascripts/
            views/
                layouts/

Et dans votre contrôleur, vous pouvez aisément choisir un thème ou un autre.

class ApplicationController < ActionController::Base
    layout 'application'
    theme 'mon_theme'
end

Voir même définir -comme vous pouvez le faire avec le layout- celui-ci grâce à une méthode.

class ApplicationController < ActionController::Base
    layout 'application'</p>

<p>    theme :get_theme
    def get_theme
        current_user.theme
    end
  end

Ainsi chacun de vos utilisateur peut lui même choisir le thème qu'il désire pour votre application.

Commentaires

Postez un commentaire

Markdown activé