1
178

Contrôle des actions

Créez site6 en copiant site5.

  1. /cms
    1. ...
    2. site5
    3. 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.

  1. /cms/site6
    1. actions

Ajoutez le fichier home.php dans le dossier actions avec le contenu suivant :

  1. /cms/site6
    1. actions
      1. home.php
  1. function home($lang) {
  2.     head('title', translate('home:title', $lang));
  3.  
  4.     $footer = view('footer', $lang);
  5.  
  6.     $content = view('home', $lang);
  7.  
  8.     $output = layout('standard', compact('footer', 'content'));
  9.  
  10.     return $output;
  11. }

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.

  1. global $strings;
  2.  
  3. $strings = array(
  4.     array('title'               => 'frasq.org',
  5.     ),
  6.     'fr' => array(
  7.         'description'           => 'frasq.org : Apprenez comment écrire votre propre CMS en PHP.',
  8.         'keywords'              => 'PHP HTML CSS CMS MVC site web language programmation tutoriel manuel cours exemple',
  9.         'home:title'            => 'Accueil',
  10.     ),
  11.     'en' => array(
  12.         'description'           => 'frasq.org : Learn how to write your own CMS in PHP.',
  13.         'keywords'              => 'PHP HTML CSS CMS MVC web site langage programming tutorial manual course example',
  14.         'home:title'            => 'Home',
  15.     ),
  16. );

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 :

  1. /cms/site6
    1. includes
      1. aliases.inc
  1. global $aliases;
  2.  
  3. $aliases = array(
  4.     'fr' => array(
  5.         'accueil'               => 'home',
  6.     ),
  7.     'en' => array(
  8.         'home'                  => 'home',
  9.     ),
  10. );

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.

  1. global $aliases;
  2.  
  3. $aliases = array();
  4.  
  5. @include 'aliases.inc';

Charge le tableau global $aliases.

  1. 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.

  1. function url($action, $lang=false, $args=false) {
  2.     global $base_path;
  3.  
  4.     return $base_path.'/'.alias($action, $lang, $args);
  5. }

url retourne l'URL d'une action, selon une langue.

  1. function alias($action, $lang=false, $args=false) {
  2.     $path = detour($action, $lang);
  3.  
  4.     if ($args) {
  5.         if ($path) {
  6.             $path .= '/';
  7.         }
  8.         $path .= implode('/', $args);
  9.     }
  10.  
  11.     return $lang ? $lang.'/'.$path : $path;
  12. }

alias retourne le chemin d'une URL pour une action, selon une langue.

  1. function detour($action, $lang=false) {
  2.     global $aliases;
  3.  
  4.     if ($lang && array_key_exists($lang, $aliases)) {
  5.         if (($path = array_search($action, $aliases[$lang]))) {
  6.             return $path;
  7.         }
  8.     }
  9.     if (array_key_exists(0, $aliases)) {
  10.         if (($path = array_search($action, $aliases[0]))) {
  11.             return $path;
  12.         }
  13.     }
  14.  
  15.     return false;
  16. }

detour retourne l'alias d'une action, selon une langue.

  1. function route($query, $lang=false) {
  2.     global $aliases;
  3.  
  4.     $args = array();
  5.  
  6.     if (empty($query)) {
  7.         return array('home', false);
  8.     }
  9.  
  10.     $s = explode('/', $query);
  11.  
  12.     while (count($s) > 0) {
  13.         $p = implode('/', $s);
  14.         if ($lang && array_key_exists($lang, $aliases) && array_key_exists($p, $aliases[$lang])) {
  15.             return array($aliases[$lang][$p], $args);
  16.         }
  17.         if (array_key_exists(0, $aliases) && array_key_exists($p, $aliases[0])) {
  18.             return array($aliases[0][$p], $args);
  19.         }
  20.         array_unshift($args, array_pop($s));
  21.     }
  22.  
  23.     return false;
  24. }

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.

  1.     $action=$args=false;
  2.     $r = route($path, $lang);
  3.     if (!$r) {
  4.         header('HTTP/1.0 404 Not Found');
  5.         exit;
  6.     }
  7.     else {
  8.         list($action, $args) = $r;
  9.     }
  10.    
  11.     run($action, $lang, $args);
  12. }

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.

  1. function run($action, $lang=false, $args=false) {
  2.     head('lang', $lang);
  3.     head('title', translate('title', $lang));
  4.     head('description', translate('description', $lang));
  5.     head('keywords', translate('keywords', $lang));
  6.     head('favicon', 'favicon');
  7.  
  8.     $file = ACTIONS_DIR.DIRECTORY_SEPARATOR.$action.'.php';
  9.     require_once $file;
  10.  
  11.     $func = basename($action);
  12.  
  13.     if ($lang) {
  14.         if ($args) {
  15.             array_unshift($args, $lang);
  16.         }
  17.         else {
  18.             $args = array($lang);
  19.         }
  20.     }
  21.  
  22.     $output = $args ? call_user_func_array($func, $args) : call_user_func($func);
  23.    
  24.     if ($output) {
  25.         echo $output;
  26.     }
  27.    
  28.     exit;
  29. }

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.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8" lang="fr" />
  5. <meta name="description" content="frasq.org : Apprenez à écrire votre propre CMS en PHP." />
  6. <meta name="keywords" content="PHP HTML CSS CMS MVC site web language programmation tutoriel manuel cours exemple" />
  7. <meta name="robots" content="index, follow" />
  8. <link href="/cms/site6/css/zero.css" rel="stylesheet" type="text/css" media="screen" />
  9. <link href="/cms/site6/css/screen.css" rel="stylesheet" type="text/css" media="screen" />
  10. <link href="/cms/site6/css/theme.css" rel="stylesheet" type="text/css" media="screen" />
  11. <link href="/cms/site6/css/print.css" rel="stylesheet" type="text/css" media="print" />
  12. <link rel="shortcut icon" href="/cms/site6/favicon.ico" type="image/x-icon" />
  13. <title>Accueil</title>
  14. </head>
  15. <body>
  16. <div id="content">
  17. <h3>Bienvenue</h3>
  18. </div>
  19. <div id="footer">
  20. <p>&copy;2010 frasq.org - Tous droits réservés - <a href="http://www.frasq.org">www.frasq.org</a> - 13 mai 2010</p>
  21. <p><img src="/cms/site6/images/ubuntu.png" alt="" width="16" height="16" />&nbsp;<a href="http://www.ubuntu.com" target="_blank">Ubuntu</a></p>
  22. </div>
  23. </body>
  24. </html>

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].