Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

La gestion du titre des pages avec Zend Framework 2

Article posté le 25-06-2014 dans la catégorie PHP

Continuons avec Zend Framework 2, aujourd'hui voici comment définir sa balise meta Title - Le titre de la page - avec les composants du framework. Vous devez avoir donc quelques pages qui fonctionnent.

On va partir du principe que vous avez mis en pratique le tuto comment supprimer le module application avant de lire celui-ci.

Nous verrons deux méthodes. Une en 'dur' (manuelle), et une automatique.

1- Préambule

Tout d'abord, dans votre fichier view/layout/layout.phtml , vous devez effectuer la modification suivante :

En début de fichier, retirez :

headTitle('ZF2 ' . $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?>

et remplacez par :

echo $this->headTitle();

Cette modification nous permet d'enlever tous ce que Zend ajoute par défaut, et de choisir ce que l'on voudra afficher dans la balise title.

Ainsi depuis la vue, vous aurez juste à faire :

$this->headTitle("Mon titre");

2- Méthode manuelle

Il s'agit de la plus longue. Elle ne "vaut le coup" que pour un site ne comptant que quelques pages, car vous devrez éditer le fichier module.config.php à chaque ajout de page. De plus, dans le cas de page générées dynamiquement comme dans le cas d'un blog par exemple, ce système est inapplicable ou très difficile à mettre en place.

A- Dans le fichier Module.php

Dans la méthode onBootstrap, rajoutez ces lignes :

//Titre :
$app = $e->getParam('application');
$app->getEventManager()->attach('render', array($this, 'setLayoutTitle'));

Toujours en nous basant sur la documentation officielle, et toujours dans le même fichier, rajoutez cette méthode :

public function setLayoutTitle($e)
    {
        $matches    = $e->getRouteMatch();
if($matches){
        $title = $matches->getParam('title');
        $module     = __NAMESPACE__;
        $siteName   = 'Bibliothèque de TOTO';
        // Récuperer le viewHelper
        $viewHelperManager = $e->getApplication()->getServiceManager()->get('viewHelperManager');
        // Récuperer le head Title helper du view Helper
        $headTitleHelper   = $viewHelperManager->get('headTitle');
        // Mise en place d'un séparateur
        $headTitleHelper->setSeparator(' - ');
        // Ajout des éléments à mon title
        $headTitleHelper->append($title);
        $headTitleHelper->append($siteName);
}
    }

Explications :

 La variable siteName est facultative, mais si vous l'utilisez elle doit contenir dans l'idéal le titre de votre site, par exemple ici "La bibliothèque de Toto". Ensuite, la méthode va appeler et instancier le viewHelper nécessaire pour la gestion du titre des pages. Mais c'est surtout la suite qui nous intéresse :

Définition du séparateur :

$headTitleHelper->setSeparator(' - ');

Et ici, on place ce que l'on veut dans le title :

$headTitleHelper->append($title);
$headTitleHelper->append($siteName);

Ici je place d'abord le contenu de ma variable title (voir juste après), puis suivie du titre du site. Ce qui donnerait  comme balise Title :

Titre de la page - Titre du Site

La variable title est déclarée au début de la méthode :

$title = $matches->getParam('title');

Je lui demande ici de récuperer l'attribut 'title' de la route de la page en cours. Nous y reviendrons plus tard. J'aurai pu, avec le même système, récuperer :

Le nom du contrôleur :

$controller = $matches->getParam('controller');

ou de l'action :

$controller = $matches->getParam('action');

Maintenant, pour pouvoir utiliser tout cela, il reste une petite modification à réaliser.

B- module.config.php

Pour chacune de vos routes, dans le tableau options, rajouter un attribut title :

'defaults' => array(
                                'action' => 'editer',
                                'title' => "Editer un auteur",
                            ),

Vous pouvez à présent essayer, cela fonctionne.

3- La méthode automatique

Dans le cas où vous gérez un grand nombre de pages, que vous utilisez un back office par exemple, vous stockez certainement vos balises dans une base de données.

Une fois que dans votre contôleur vous avez chargé les informations de la page pour les transmettre à la vue, vous devez appeler cette méthode, afin de lui passer en paramètre le titre de la page :

$this->getServiceLocator()->get('ViewHelperManager')->get('HeadTitle')->set('my title');

Ainsi, avec une seule ligne de code, vous pourrez gérer le titre de vos pages.


Tweet
comments powered by Disqus