RSS
 

Les pages statiques avec CakePHP

19 fév

CakePHP : Frameword de RAD en PHP

Cela fait un moment que je souhaite rédiger cet article, car la gestion des pages statiques est une fonctionnalité livrée avec CakePHP mais vraiment sous utilisée !

En effet, nous avons pu voir en quoi le framework était utile pour développer rapidement des applications dynamiques, une zone d’administration sécurisée et en l’importance des conventions pour se simplifier la tâche. Sachez également que Cake vous permet en quelques minutes d’utiliser la puissance de ses helpers (Html, Javascript, Css …) et de sa structure (layouts, éléments) afin de créer en quelques minutes une application statique propre, maintenable et évolutive.

Rien ne vous empêchera par la suite de faire évoluer cette application « basique » vers des fonctionnalités dynamiques plus avancées (édition de pages, blog, forum, sondage, internationalisation …).

@flickr: putting things togetherLe mécanisme de gestion des pages

Dans sa version de base, une application CakePHP peut utiliser le système de gestion de pages statiques livré avec le framework. Il existe un contrôleur « PagesController » qui permet de gérer automatiquement les pages statiques. C’est celui-ci que vous pourrez adapter pour ajouter par exemple de nouveaux Helpers.

Ainsi toutes les pages contenues dans le dossier « /views/pages/ » d’une application (ex : « /views/pages/url-de-la-page.ctp » seront accessibles en utilisant une adresse de type http://www.monsite.com/pages/url-de-la-page. On peut également créer des sous-dossiers : « /views/pages/categorie/ma-mapage.ctp » sera accessible par http://www.monsite.com/pages/categorie/ma-page

Par défaut, c’est d’ailleurs la page « home.ctp » qui est affichée quand vous créez votre application. Bien entendu, comme dans toute application il y aura un layout (« /views/layouts/default.ctp« ), la possibilité d’inclure des éléments (menu) etc …

Tout ceci (page par défaut, chemin d’accès etc…) se configure très simplement grâce au système de routes de Cake. Voici les routes d’origine qui permettent de fournir les services mentionnés plus haut :

/**
 * Here, we are connecting '/' (base path) to controller called 'Pages',
 * its action called 'display', and we pass a param to select the view file
 * to use (in this case, /app/views/pages/home.ctp)...
 */
	Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
/**
 * ...and connect the rest of 'Pages' controller's urls.
 */
	Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
	Router::connect('/contact/*', array('controller' => 'pages', 'action' => 'display', 'contact')); // Exemple de raccourci spécifique

Pour modifier la page d’accueil, éditez la première des 2 routes, et la seconde vous permettra de remplacer « /pages/ » dans vos url par ce que vous voulez (ex : « /contenus/« ). J’ai ajouté une troisième route vous permettant de comprendre comment créer un « raccourci » spécifique à une page.

Les helpers et commandes à connaître

Afin de pouvoir rendre votre application statique belle et riche, vous aurez sans doute besoin de Javascript spécifique à certaines pages, de feuilles CSS adaptées, de gérer finement les meta-tags pour optimiser votre référencement … ne serait-ce que le titre !

Vous êtes pressés par le temps (car 10 minutes pour créer votre application et intégrer le design c’est déjà beaucoup ;) ) et souhaitez avoir encore une fois un code beau et maintenable : mais on s’en doute, CakePHP à tout prévu !

Note : les lignes de code mentionnées ci-dessous sont à inclure à l’intérieur même de votre page de vue (ex : « /views/pages/categorie/ma-mapage.ctp« ).

Modification du titre de la page

Rien de plus simple, il suffit de modifier l’attribut « pageTitle » de votre page.

$this->pageTitle = 'Titre de la page';

Modification des meta-tags

Le HTMLHelper vous permet de gérer tous les types de meta-tags existants (description, keywords, robots …). Je vous recommande de regarder l’API ou la documentation pour savoir exactement quelles sont les signatures méthodes du HTMLHelper.

Pour modifier les meta-tags de votre page statique (ex : une description), vous devrez utiliser le code suivant :

// meta(string $type, string $url = null, array $attributes = array(), boolean $inline = true)
$html->meta('description', null, array(), false)

Remarquez les paramètres 2 et 3 laissés à leur valeur par défaut afin de modifier le dernier (« inline ») et lui affecter la valeur false. Cela signifie que la balise ne sera pas renvoyée lors de l’appel de la fonction pour un affichage local, mais qu’il sera inclus dans l’en-tête de votre page à l’endroit où le gabarit contient l’instruction :

echo $scripts_for_layout;

Modification du CSS

De la même manière, nous utiliserons le HTMLHelper pour ajouter des feuilles CSS spécifiques dans une page :

// css(mixed $path, string $rel = null, array $htmlAttributes = array(), boolean $inline = true)
$html->css('ma-feuille', null, array(), false);

Modification du gabarit (layout) de la page

De manière similaire à la personnalisation du titre présentée plus haut, nous pouvons modifier le gabarit d’une page par l’instruction :

$this->layout = 'autre-gabarit';

Insérer un script Javascript

Vous l’aurez compris il n’y a strictement rien de spécial à utiliser des pages statiques et les helpers fonctionnent normalement. Je vous invite à regarder la documentation et à faire des essais pour arriver à faire exactement ce que vous voulez.

Dernier exemple proposé ici, l’insertion d’un script javascript dans votre page :

// link($url, $inline);
$javascript->link('mon-script', false);

Un bazooka pour tuer une mouche ?

Compound Eyes of a Robber Fly - (Holcocephala fusca)J’entends déjà les réfractaires du fond de la salle :

Mais là du coup on a 800 fichiers différents alors que 4 pages HTML auraient suffit !

C’est sûr que ça fait « gros » pour ce que c’est … mais avez-vous vu la souplesse que cela offre ? En 10 minutes tout est prêt, vous n’avez QUE le contenu des pages à modifier. Qu’en est-il de l’optimisation pour le référencement, de l’évolutivité du site réalisé ?

En effet, imaginez que ce site doive être traduit dans une autre langue : vu que vous êtes un développeur bien sage, vous avez pris l’habitude d’utiliser les méthodes gettext (__(‘Mon texte’)) et cela ne vous prendra que le temps de lancer un script shell et de traduire les chaînes. Imaginez que vous vouliez ajouter un livre d’or : 15 minutes pour créer une base de données et générer les pages CRUD avec bake. Enfin bref, vous avez compris !!!

Un framework sera forcément moins rapide en terme de performances que des pages HTML, mais votre site va-t-il recevoir tant de visiteurs que ça ? C’est assez rare pour un site statique de nos jours ;) Vous n’avez qu’à peser le pour et le contre … et choisir en toute connaissance de cause !

Pensez à utiliser mon flux RSS pour vous tenir au courant des futurs articles ! Vous pouvez aussi me retrouver sur Twitter pour une actualité plus fréquente.

 
8 Comments

Posted in En vrac

 

Tags: , ,

  • Thecanea

    Sympa l’article ;) Merci Pierre-Martin.

    Après lecture, je me suis dit Ahh.. j’aurais du le lire avant pour aller plus vite lors de la compréhension du fonctionnement pour mettre en place ma page d’accueil souhaitée !… Pis j’ai vu la date, et ça m’a rassuré^^

    Merci encore, bonne continuation…

    Thec / Hugo

  • GueulDeRak

    Bjr,
    comprends pas qq chose.
    Pourquoi parler de sites static alors que le fait d’utiliser Php permet de créer des sites dynamiques ?
    pour moi statique implique créer en dur des fichier html. Si j’utilise Php avec des variables, je rends mon site dynamique…
    Je sais pas si je suis clair ?

  • Thecanea

    Bin en fait, tu peux faire des sites statiques en php : statique veut dire que le contenu restera le même (à part d’éventuelles variables style des stats, une date…); à l’opposé tu trouveras les sites dynamiques liés à une base de données : là le contenu est en perpétuel évolution (comme la base)…

    L’intérêt est ou ?? Bin en fait, si tu veux créer un site complet, on trouve bien souvent des parties dynamiques (interaction avec l’utilisateur…, administration back office…) et des parties fixes, statiques, comme par exemples : la page a propos, mentions légales, contact, éventuellement la page d’accueil….

    Du coup c’est indispensable qu’un framework php permette tout de même la création basique (html) de pages statiques !!!

    Bien entendu, si ton but est de créer entièrement un site statique, l’intérêt de Cake est réduit; cependant ce n’est pas ce qui est fait le plus souvent; le moindre site a bien souvent quelque interaction (formulaire de contact, sondages, ajout dynamique d’articles par un administrateur non informaticien : lui évitant ainsi de mettre a jour des fichiers xhtml alors qu’il n’y connait rien….)

    Voili voilou, en espérant avoir apporté quelques lumières à ta réflexion ;)

    Cordialement,

    Thec

  • http://www.pierre-martin.fr Pierre MARTIN

    Merci GueulDeRak pour cette remarque, il faut en effet quelques précisions supplémentaires.
    Comme l’a fait remarquer Thecanea, c’est simplement le contenu des pages qui est statique.
    L’intérêt ici est de créer une ou plusieurs pages statiques d’un site qui en contient d’autres un minimum dynamiques.

    Néanmoins, le gestion de gabarit et les différents helpers fournis par Cake peuvent faciliter la tâche même pour des sites 100% statiques (regroupement du design dans un seul fichier, assistants javascript …).

    Pierre

  • ed

    Question à propos des pages statiques et de leur accessibilité lorsque l’on utilise le composant Auth pour l’ensemble de l’appli.
    en résumé, j’ai mon appli protéger par Auth. Pour donner acces à certaines pages, j « allow » certaines fonctions au sein du controller.
    Mais comment rendre accessibles la home et autres pages statiques san login et mdp ?
    Merci

  • http://www.pierre-martin.fr MARTIN

    Bonjour ed,

    Il suffit pour cela de rajouter la commande « $this->Auth->allow(‘*’); » dans une méthode beforeFilter() de « app/controllers/pages_controller.php ».

    function beforeFilter(){
    parent::beforeFilter();
    $this->Auth->allow(‘*’);
    }

    C’est ce contrôleur qui se charge des pages statiques.

    Pierre

  • ed

    Merci pour ta réponse.
    Cela fonctionne mais j’ai placé la fonction dans « cake\libs\controller ».

    Ed

  • mike brandt

    @ed :
    aïe,
    il n’est pas forcément bon de modifier le noyau de cake, parce que tu perdras tes modifs en cas de mise à jour vers la nouvelle version quand elle sortira…
    (et oui, tu auras peut-être besoin de faire la mise à jour, si par exemple une faille de sécurité a été découverte)
    le dossier /app permet de surcharger le noyau sans le modifier, c’est très prudent et très pratique.