Symfony et bootstrap

Table of Contents

1 Bootstrap

Un framework CSS (et JS) populaire : http://getbootstrap.com/

Documentation : http://getbootstrap.com/css/

2 Ajout du support de Bootstrap dans Symphony

Différentes solutions d'installation sont possibles. Nous allons nous baser sur l'utilisation du bundle Assetic de Symfony, qui permet notamment de gérer les sources CSS et Javascript comme les sources PHP dans l'environnement de développement.

2.1 Activation d'Assetic

  1. On installe le bundle assetic avec composer :

    php ../bin/composer.phar require symfony/assetic-bundle
    
  2. On modifie la liste des budles chargés, dans app/AppKernel.php (cf. documentation Assetic)
  3. Enfin, modification de config.yml pour ajouter :

    assetic:
        debug:          '%kernel.debug%'
        use_controller: '%kernel.debug%'
        filters:
            cssrewrite: ~
    

2.2 Installation de JQuery et Bootstrap

Installer les packages JQuery et Bootstrap avec composer :

  1. Modifier composer.json pour ajouter les dépendances :

    "require": {
        ...
        "twitter/bootstrap": "3.*",
        "components/jquery": "1.11.1"
    }
    
  2. Installer les packages :

    php ../bin/composer.phar update
    

2.3 Définition d'assets dans Assetic

On ajoute la configuration des assets pour JQuery et Bootstrap dans la configuration d'Assetic dans config.yml (source : Bootstrap 3 in Symfony 2 with Composer and no extra bundles):

assetic:
...
  assets:
      bootstrap_js:
        inputs:
          - %kernel.root_dir%/../vendor/twitter/bootstrap/dist/js/bootstrap.js
      bootstrap_css:
        inputs:
          - %kernel.root_dir%/../vendor/twitter/bootstrap/dist/css/bootstrap.css
          - %kernel.root_dir%/../vendor/twitter/bootstrap/dist/css/bootstrap-theme.css
        filters: [cssrewrite]

      bootstrap_glyphicons_ttf:
        inputs:
          - %kernel.root_dir%/../vendor/twitter/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
        output: "fonts/glyphicons-halflings-regular.ttf"
      bootstrap_glyphicons_eot:
        inputs:
          - %kernel.root_dir%/../vendor/twitter/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
        output: "fonts/glyphicons-halflings-regular.eot"
      bootstrap_glyphicons_svg:
        inputs:
          - %kernel.root_dir%/../vendor/twitter/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
        output: "fonts/glyphicons-halflings-regular.svg"
      bootstrap_glyphicons_woff:
        inputs:
          - %kernel.root_dir%/../vendor/twitter/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
        output: "fonts/glyphicons-halflings-regular.woff"

      jquery:
        inputs:
          - %kernel.root_dir%/../vendor/components/jquery/jquery.js

Tester sur http://localhost:8000/app_dev.php que l'application fonctionne toujours.

2.4 Ajout du chargement des feuilles de styles et des scripts aux templates

On modifie le template base.html.twig pour définir le chargement des assets bootstrap_css, jquery et bootstrap_js dans les pages, via les blocs stylesheets et javascripts (initialement vides):

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}
          {% stylesheets '@bootstrap_css' filter='cssrewrite' %}
             <link rel="stylesheet" type="text/css" media="screen" href="{{ asset_url }}"/>
           {% endstylesheets %}
           <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
        {% endblock %}
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}
          {% javascripts '@jquery' '@bootstrap_js' %}
            <script type="text/javascript" src="{{ asset_url }}"></script>
          {% endjavascripts %}
        {% endblock %}
    </body>
</html>

Il faut ensuite vider le cache afin de s'assurer que les assets soient bien regénérés par Assetic :

php bin/console cache:clear

2.5 Vérifications

Vérifier que les liens vers les assets CSS et JS de Bootstrap et JQuery sont bien présents dans les headers et le corps des pages HTML, qui chargent des ressources générées dynamiquement par Symfony (examiner le source de la page HTML).

Comparer le comportement entre http://localhost:8000/app_dev.php et http://localhost:8000/app_dev.php/circuit/ Si seulement une partie des ressources manque, expliquer pourquoi.

3 Utilisation de Bootstrap dans les templates de l'application

3.1 Mise en place d'une structure de page

Bootstrap repose sur une structure de pages un peu particulière, avec un certain nombre de blocs <div> dans l'arbre DOM, comme par exemple le bloc englobant de classe container ou container-fluid :

<div class="container">
...
</div>

On modifiera alors la structure des templates pour intégrer ces éléments structurants, par exemple en définissant, dans le bloc TWIG body, dans base.html.twig les grands éléments de la mise en page, et en réservant l'affichage de chacune des pages de l'application à un sous-bloc main. Extrait de base.html.twig :

<!DOCTYPE html>
<html>
    <body>

      ...

        <div class="container-fluid">
                {% block body %}
                <div class="row">
                        <div class="col-sm-3 col-md-2 sidebar">
                                {% block sidebar %}
                                ...
                                {% endblock %} {# sidebar #}
                        </div> <!-- sidebar -->
                        <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">

                           {% block main %} {% endblock %}

                        </div> <!-- main -->
                </div> <!-- row -->

                {% endblock %} {# body #}

        </div> <!-- container-fluid -->
        ...
    </body>
</html>

Chaque page définira alors son contenu à l'intérieur du bloc main surchargé. Exemple index.html.twig :

{% extends 'base.html.twig' %}

{% block main %}

<h1>Hello world !</h1>

{% endblock %}

3.2 Utilisation des styles de widgets

Modifier les templates afin d'utiliser les bonnes classes pour les éléments d'interface, par exemple pour ajouter des liens en forme de boutons pour les actions de création, ajout ou suppressions.

Author: Olivier Berger

Created: 2016-02-17 mer. 11:51

Validate