Contrôle des actions
Créez site6 en copiant site5.
- /cms
- ...
- site5
- site6
Dans ce chapitre, nous allons programmer l'interprétation d'une URL et sa conversion en une action.
Pour tester le résultat en ligne, entrez http://wwww.frasq.org/cms/site6 dans la barre d'adresse de votre navigateur.
Créez le dossier actions dans site6.
- /cms/site6
- actions
Ajoutez le fichier home.php dans le dossier actions avec le contenu suivant :
- /cms/site6
- actions
- home.php
- actions
- function home($lang) {
- head('title', translate('home:title', $lang));
- $footer = view('footer', $lang);
- $content = view('home', $lang);
- $output = layout('standard', compact('footer', 'content'));
- return $output;
- }
La fonction home
a un seul argument, $lang
, la langue d'affichage du contenu.
home
commence par ajouter le titre de la page à l'en-tête du document puis génère les vues pour la partie centrale et le pied de la page.
Le tout est assemblé avec la fonction layout
.
home
retourne le corps du document.
Ajoutez le titre de la page d'accueil dans strings.inc.
- global $strings;
- $strings = array(
- array('title' => 'frasq.org',
- ),
- 'fr' => array(
- 'description' => 'frasq.org : Apprenez comment écrire votre propre CMS en PHP.',
- 'keywords' => 'PHP HTML CSS CMS MVC site web language programmation tutoriel manuel cours exemple',
- 'home:title' => 'Accueil',
- ),
- 'en' => array(
- 'description' => 'frasq.org : Learn how to write your own CMS in PHP.',
- 'keywords' => 'PHP HTML CSS CMS MVC web site langage programming tutorial manual course example',
- 'home:title' => 'Home',
- ),
- );
description
et keywords
définissent le contenu par défaut des balises meta name="description"
et meta name="keywords"
, essentielles pour les moteurs de recherche.
Ajoutez le fichier aliases.inc dans le dossier includes avec le contenu suivant :
- /cms/site6
- includes
- aliases.inc
- includes
- global $aliases;
- $aliases = array(
- 'fr' => array(
- 'accueil' => 'home',
- ),
- 'en' => array(
- 'home' => 'home',
- ),
- );
aliases.inc définit le tableau global $aliases
qui associe, selon une langue, un chemin dans une URL avec une action.
Tout le travail de lecture ou d'écriture des URLs est réalisé dans engine.php.
- global $aliases;
- $aliases = array();
- @include 'aliases.inc';
Charge le tableau global $aliases
.
- define('ACTIONS_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'actions');
Définit dans quel dossier se trouvent les actions. Une action est une fonction définie dans un fichier du même nom.
- function url($action, $lang=false, $args=false) {
- global $base_path;
- return $base_path.'/'.alias($action, $lang, $args);
- }
url
retourne l'URL d'une action, selon une langue.
- function alias($action, $lang=false, $args=false) {
- $path = detour($action, $lang);
- if ($args) {
- if ($path) {
- $path .= '/';
- }
- $path .= implode('/', $args);
- }
- return $lang ? $lang.'/'.$path : $path;
- }
alias
retourne le chemin d'une URL pour une action, selon une langue.
- function detour($action, $lang=false) {
- global $aliases;
- if ($lang && array_key_exists($lang, $aliases)) {
- if (($path = array_search($action, $aliases[$lang]))) {
- return $path;
- }
- }
- if (array_key_exists(0, $aliases)) {
- if (($path = array_search($action, $aliases[0]))) {
- return $path;
- }
- }
- return false;
- }
detour
retourne l'alias d'une action, selon une langue.
- function route($query, $lang=false) {
- global $aliases;
- $args = array();
- if (empty($query)) {
- return array('home', false);
- }
- $s = explode('/', $query);
- while (count($s) > 0) {
- $p = implode('/', $s);
- if ($lang && array_key_exists($lang, $aliases) && array_key_exists($p, $aliases[$lang])) {
- return array($aliases[$lang][$p], $args);
- }
- if (array_key_exists(0, $aliases) && array_key_exists($p, $aliases[0])) {
- return array($aliases[0][$p], $args);
- }
- array_unshift($args, array_pop($s));
- }
- return false;
- }
route
retourne l'action associée à un chemin dans une URL, selon une langue.
Le reste du chemin est aussi retourné comme une liste d'arguments.
Si le chemin est vide, route
renvoie à la page d'accueil.
Si le chemin ne correspond à aucune action, route
retourne false
.
- $action=$args=false;
- $r = route($path, $lang);
- if (!$r) {
- header('HTTP/1.0 404 Not Found');
- exit;
- }
- else {
- list($action, $args) = $r;
- }
- run($action, $lang, $args);
- }
La fin de dispatch
appelle maintenant route
pour obtenir le nom d'une action et une liste d'arguments puis les passe avec la langue d'affichage à run
.
Si aucune action n'est associée à l'URL, une erreur HTTP 404 est renvoyée au demandeur.
- function run($action, $lang=false, $args=false) {
- head('lang', $lang);
- head('title', translate('title', $lang));
- head('description', translate('description', $lang));
- head('keywords', translate('keywords', $lang));
- head('favicon', 'favicon');
- $file = ACTIONS_DIR.DIRECTORY_SEPARATOR.$action.'.php';
- require_once $file;
- $func = basename($action);
- if ($lang) {
- if ($args) {
- array_unshift($args, $lang);
- }
- else {
- $args = array($lang);
- }
- }
- $output = $args ? call_user_func_array($func, $args) : call_user_func($func);
- if ($output) {
- echo $output;
- }
- exit;
- }
run
commence par remplir certaines balises meta
de l'en-tête du document avec leurs valeurs par défaut.
Le reste du code charge le fichier correspondant à l'action demandée puis appelle la fonction du même nom avec la langue et les arguments de l'action en paramètres.
run
renvoie tout le document généré et termine l'exécution de la requête.
Entrez http://localhost/cms/site6 dans la barre d'adresse de votre navigateur.
Affichez le code source du document. Contrôlez le résultat, en particulier la section head
.
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" lang="fr" />
- <meta name="description" content="frasq.org : Apprenez à écrire votre propre CMS en PHP." />
- <meta name="keywords" content="PHP HTML CSS CMS MVC site web language programmation tutoriel manuel cours exemple" />
- <meta name="robots" content="index, follow" />
- <link href="/cms/site6/css/zero.css" rel="stylesheet" type="text/css" media="screen" />
- <link href="/cms/site6/css/screen.css" rel="stylesheet" type="text/css" media="screen" />
- <link href="/cms/site6/css/theme.css" rel="stylesheet" type="text/css" media="screen" />
- <link href="/cms/site6/css/print.css" rel="stylesheet" type="text/css" media="print" />
- <link rel="shortcut icon" href="/cms/site6/favicon.ico" type="image/x-icon" />
- <title>Accueil</title>
- </head>
- <body>
- <div id="content">
- <h3>Bienvenue</h3>
- </div>
- <div id="footer">
- <p>©2010 frasq.org - Tous droits réservés - <a href="http://www.frasq.org">www.frasq.org</a> - 13 mai 2010</p>
- <p><img src="/cms/site6/images/ubuntu.png" alt="" width="16" height="16" /> <a href="http://www.ubuntu.com" target="_blank">Ubuntu</a></p>
- </div>
- </body>
- </html>
Commentaires