Fork me on GitHub

Les vues


Jaxon fournit pour l'affichage des vues une API simple et unique, qui peut être utilisée avec différents moteurs de templates.

L'installation

Pour afficher les vues avec un moteur de template, il faut d'abord installer le package correspondant. Des packages existent actuellement pour certains moteurs de templates. Plusieurs peuvent être utilisés simultanément dans une application.

  • Twig https://github.com/jaxon-php/jaxon-twig. Son identifiant est twig.
  • Blade https://github.com/jaxon-php/jaxon-blade. Son identifiant est blade.
  • Latte https://github.com/jaxon-php/jaxon-latte. Son identifiant est latte.
  • Smarty https://github.com/jaxon-php/jaxon-smarty. Son identifiant est smarty.

Il faut ensuite déclarer les répertoires qui contiennent les templates, et les moteurs pour les afficher.

jaxon()->di()->getViewManager()->addNamespace('ns', '/path/to/namespace', '.blade.php', 'blade');

L'appel jaxon()->view()->render('ns::path/to/view') va alors afficher le template /path/to/namespace/path/to/view.blade.php avec le moteur Blade.

Les variables

Les fonctions suivantes permettent de passer des variables aux vues.

La fonction share() rend une variable disponible dans toutes les vues.

    jaxon()->view()->share('count', 5);

    // Dans un composant,
    $this->view()->share('count', 5);

La fonction set() rend une variable disponible dans la prochaine vue à afficher. Elle peut être chaînée avec la fonction render().

    jaxon()->view()->set('count', 5)->set('current', 1)->render('ns::path/to/view');

    // Dans un composant,
    $this->view()->set('count', 5)->set('current', 1)->render('ns::path/to/view');

La fonction with() ajoute une variable à la vue créée avec la fonction render().

    jaxon()->view()->render('ns::path/to/view')->with('count', 5)->with('current', 1);

    // Dans un composant,
    $this->view()->render('ns::path/to/view')->with('count', 5)->with('current', 1);

Les variables peuvent aussi être passées dans un tableau en second paramètre de la fonction render().

    jaxon()->view()->render('ns::path/to/view', ['count' => 5, 'current' => 1]);

    // Dans un composant,
    $this->view()->render('ns::path/to/view', ['count' => 5, 'current' => 1]);

Ajouter un moteur de template

Pour ajouter un moteur de templates à Jaxon, il faut créer et déclarer une classe qui implémente l'interface Jaxon\App\View\ViewInterface.

namespace Jaxon\App\View;

interface ViewInterface
{
    /**
     * Add a namespace to the view renderer
     *
     * @param string $sNamespace    The namespace name
     * @param string $sDirectory    The namespace directory
     * @param string $sExtension    The extension to append to template names
     *
     * @return void
     */
    public function addNamespace(string $sNamespace, string $sDirectory, string $sExtension = '');

    /**
     * Render a view
     *
     * @param Store $store    A store populated with the view data
     *
     * @return string
     */
    public function render(Store $store): string;
}
use Jaxon\App\View\ViewInterface;

class NewView implements ViewInterface
{
}

La méthode addNamespace() sera appelée chaque fois qu'un répertoire est associé au moteur de template. La méthode render() retourne le code HTML d'une vue. Elle prend en paramètre une instance de la classe Jaxon\App\View\Store, qui contient les données passées à la vue.

Après avoir défini la classe, il faut la déclarer avec l'appel suivant.

jaxon()->di()->getViewManager()->addViewRenderer($myViewId, function(){
    return new NewView();
});

Le paramètre $myViewId est l'identifiant unique du nouveau moteur de template, à passer à l'appel à jaxon()->di()->getViewManager()->addNamespace().

Dans le fichier de config

Les vues peuvent aussi être définies dans la section app.views de la configuration de Jaxon.

Chaque entrée de cette section est indexé par un identifiant unique, qui sera utilisé lors de l'affichage pour indiquer dans quel répertoire se trouve la vue.

Chaque entrée de cette section représente un répertoire, défini avec les informations suivantes:

  • directory : le chemin complet du répertoire.
  • extension : l'extension à ajouter aux vues du répertoire.
  • renderer : l'identifiant du moteur de templates à utiliser pour afficher les vues du répertoire.

La configuration suivante définit un répertoire /path/to/users/views qui contient des templates Smarty.

    'app' => [
        'views' => [
            'users' => [
                'directory' => '/path/to/users/views',
                'extension' => '.tpl',
                'renderer' => 'smarty',
            ]
        ]
    ],

Le code suivant affiche le template dans le fichier /path/to/users/views/path/to/view.tpl avec le moteur Smarty.

$html = jaxon()->view()->render('users::path/to/view');

Si on définit dans la configuration un namespace par défaut, alors l'identifiant peut être omis dans l'appel.

    'app' => [
        'views' => [
            'users' => [
                'directory' => '/path/to/users/views',
                'extension' => '.tpl',
                'renderer' => 'smarty',
            ]
        ],
        'options' => [
            'views' => [
                'default' => 'users',
            ]
        ]
    ],
$html = jaxon()->view()->render('path/to/view');

La vue de pagination

Avec Jaxon, les liens de pagination peuvent être affichés avec n'importe quel moteur de templates.

Pour personnaliser la pagination, il faut créer tous les templates de pagination dans un répertoire, puis l'indiquer dans la configuration des vues.

        'views' => [
            'pagination' => [
                'directory' => '/chemin/vers/le/repertoire',
                'extension' => '.tpl',
                'renderer' => 'smarty',
            ],
        ],

Le moteur de templates

Jaxon inclut par défaut un moteur de template basique, qui peut suffire pour les besoins des applications les plus simples. Bien sûr, ce moteur de template s'intègre bien au système des vues, et sera identifié dans les paramètres de configuration par la valeur jaxon.

        'views' => [
            'users' => [
                'directory' => '/path/to/users/views',
                'extension' => '.php',
                'renderer' => 'jaxon',
            ],
        ],

Mais on peut également l'utiliser directement, en affichant un template avec l'appel suivant:

jaxon()->template()->render('users::path/to/template', ['name' => $name]);

Les fonctions suivantes peuvent être utilisées dans les templates.

Insérer la valeur d'une variable ou d'un bloc.

<?= $this->content ?>

Inclure un template dans un autre.

<?php $this->include('templates::examples/nav.php') ?>

Etendre un template.

<?php $this->extends('templates::examples/layout.php') ?>

Définir le contenu d'un bloc présent dans un layout.

<?php $this->block('content') ?>
    <div>
        The page content.
    </div>
<?php $this->endblock() ?>