20

Édition d'un nœud

Créez site24 en copiant site23.

  1. /cms
    1. ...
    2. site23
    3. site24

Dans ce chapitre, nous allons créer l'éditeur de nœuds.

Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site24 dans la barre d'adresse de votre navigateur. Identifiez-vous avec le nom foobar et le mot de passe f00bar. De retour à la page d'accueil, cliquez sur le lien Informations légales. Appuyez sur le bouton Éditer dans le bandeau de la page.

L'éditeur affiche le titre, l'URL, l'extrait et le nuage de mots clés du nœud dans des champs textuels séparés. Cliquez sur le drapeau English pour éditer le nœud en anglais. Cliquez sur le drapeau Français pour revenir à la version en français. Appuyez sur le bouton Voir dans le bandeau de la page.

La vue du nœud est affichée. Appuyez sur le bouton Éditer pour revenir dans l'éditeur. Ajoutez Publication à l'extrait et le mot publication au nuage. Effacez l'URL et remplacez le titre par Conditions légales. Appuyez sur Éditer pour modifier le nœud dans la BD. L'URL est automatiquement générée à partir du titre.

NOTE : Dans cette version de démonstration, le contenu du site ne peut pas être modifié.

Commencez par créer l'action editnode en ajoutant le fichier editnode.php dans le dossier actions avec le contenu suivant :

  1. /cms/site24
    1. actions
      1. editnode.php
  1. require_once 'userhasrole.php';
  2. require_once 'models/node.inc';

Charge la fonction user_has_role et le modèle de données.

  1. function editnode($lang, $arglist=false) {
  2.     global $supported_languages;
  3.  
  4.     if (!user_has_role('writer')) {
  5.         return run('error/unauthorized', $lang);
  6.     }

Déclare la variable globale $supported_languages. Vérifie que l'utilisateur est identifié et qu'il est autorisé à modifier le contenu du site.

  1.     $node=false;
  2.  
  3.     if (is_array($arglist)) {
  4.         if (isset($arglist[0])) {
  5.             $node=$arglist[0];
  6.         }
  7.     }
  8.  
  9.     if (!$node) {
  10.         return run('error/notfound', $lang);
  11.     }
  12.  
  13.     $node_id = node_id($node);
  14.     if (!$node_id) {
  15.         return run('error/notfound', $lang);
  16.     }

Extrait le numéro du nœud des paramètres d'appel de la requête dans $node_id. Vérifie que $node_id existe dans la BD. Renvoie un document HTTP 404 Not Found en cas d'erreur.

  1.     $clang=false;
  2.     foreach ($supported_languages as $slang) {
  3.         if (isset($_POST[$slang . '_x'])) {
  4.             $clang=$slang;
  5.             break;
  6.         }
  7.     }
  8.     if (!$clang) {
  9.         if (isset($_POST['clang'])) {
  10.             $clang = $_POST['clang'];
  11.         }
  12.         else if (isset($_GET['clang'])) {
  13.             $clang = $_GET['clang'];
  14.         }
  15.         else {
  16.             $clang=$lang;
  17.         }
  18.         if (!in_array($clang, $supported_languages)) {
  19.             return run('error/notfound', $lang);
  20.         }
  21.     }

Détermine la langue du contenu à éditer. Teste en premier si l'utilisateur a appuyé sur un des sélecteurs d'une langue parmi celles supportées. Sinon, tente d'extraire le champ caché clang envoyé dans un POST ou le paramètre clang de l'URL d'un GET. Cliquer sur le sélecteur d'une langue ou sur Éditer dans le formulaire envoie un POST. Cliquer sur Éditer ou Voir dans le bandeau envoie un GET. Si la langue spécifiée en POST ou en GET n'est pas supportée, un document HTTP 404 Not Found est renvoyé. Par défaut, la langue du contenu est identique à celle de la requête.

  1.     $node_editor = build('nodeeditor', $lang, $clang, $node_id);
  2.  
  3.     head('title', $node_id);
  4.     head('description', false);
  5.     head('keywords', false);
  6.     head('robots', 'noindex, nofollow');
  7.  
  8.     $view=url('node', $clang) . '/'. $node_id;
  9.     $validate=url('node', $clang) . '/'. $node_id;
  10.     $banner = build('banner', $lang, compact('view', 'validate'));
  11.  
  12.     $content = view('editing/editnode', $lang, compact('node_editor'));
  13.  
  14.     $output = layout('editing', compact('banner', 'content'));
  15.  
  16.     return $output;
  17. }

Construit le bloc de l'éditeur du nœud en passant la langue de la requête, la langue du contenu et le numéro du nœud à la fonction nodeeditor. Remplit l'en-tête du document final. Notez que comme l'affichage direct d'un nœud n'est normalement pas accessible, les champs exploités par les moteurs de recherche sont vides. Ajoute les boutons Voir et Valider au menu dans le bandeau avec en paramètre l'URL du contenu du nœud. Construit la vue de l'éditeur. Assemble le document final avec la disposition editing et le retourne.

Ajoutez le fichier editing.phtml dans le dossier layouts avec le contenu suivant :

  1. /cms/site24
    1. layouts
      1. editing.phtml
  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. <?php echo $head; ?>
  5. </head>
  6. <body>
  7. <div id="editor">
  8. <?php echo $banner; ?>
  9. <div id="content">
  10. <?php echo $content; ?>
  11. </div>
  12. </div>
  13. </body>
  14. </html>

La disposition editing.phtml place tout le corps du document dans une balise <div id="editor">. Elle n'affiche pas de pied de page. Modifiez aussi la disposition standard.phtml pour encadrer tout le corps du document dans une balise <div id="viewer"> :

  1. <body>
  2. <div id="viewer">
  3. <?php echo $banner; ?>
  4. <div id="content">

Créez les dossiers views/fr/editing et views/en/editing. Ajoutez la vue en français de l'éditeur dans le dossier views/fr/editing et la version en anglais dans le dossier views/en/editing :

  1. /cms/site24
    1. views
      1. fr
        1. editing
          1. nodeeditor.phtml
      2. en
        1. editing
          1. nodeeditor.phtml
  1. <?php echo $node_editor; ?>
  1. <?php echo $node_editor; ?>

Pour donner accès à l'action editnode, ajoutez un alias par langue dans le fichier includes/aliases.inc :

  1.         'edition/noeud'         => 'editnode',
  1.         'edit/node'             => 'editnode',

Ajoutez le fichier nodeeditor.php dans le dossier blocks avec le contenu suivant :

  1. /cms/site24
    1. blocks
      1. nodeeditor.php
  1. require_once 'readarg.php';
  2. require_once 'strtofname.php';
  3. require_once 'models/node.inc';

Charge les fonctions readarg et strtofname et le modèle de données.

Modifiez le fichier readarg.php dans le dossier library :

  1. function readarg($s, $trim=true, $strip=true) {

Ajoute le paramètre $strip.

  1.     if (is_array($s)) {
  2.         $r=array();
  3.         foreach ($s as $ss) {
  4.             $r[]=readarg($ss, $trim, $strip);
  5.         }
  6.         return $r;
  7.     }

Permet de filtrer un tableau de chaînes de caractères.

  1.     if (get_magic_quotes_gpc()) {
  2.         $s = stripslashes($s);
  3.     }
  4.  
  5.     if ($trim) {
  6.         $s = trim($s);
  7.     }
  8.  
  9.     if ($strip) {
  10.         $s = strip_tags($s);
  11.     }
  12.  
  13.     return $s;
  14. }

Retire les \ (BACKSLASH) de $s ajoutés automatiquement par PHP dans les variables $_GET et $_POST si le paramètre de configuration magic_quotes_gpc est à true. Retire les espaces au début ou à la fin de $s si $trim vaut true. Retire toutes les balises de $s si $strip vaut true. Cette dernière option permet de protéger le site d'un contenu qui pourrait faire des appels à d'autres sites ou exécuter du code. EXEMPLE : Le texte <script type="text/javascript">alert('DANGER');</script> saisi dans un formulaire exécute du code en Javascript s'il est injecté sans précaution dans le rendu du site.

  1. /cms/site24
    1. library
      1. strtofname.php
  1. require_once 'strflat.php';
  2.  
  3. function strtofname($s, $strict=false) {
  4.     /* remove accents */
  5.     $s = strflat($s);
  6.  
  7.     /* lower case */
  8.     $s = strtolower($s);
  9.  
  10.     /* keep letters, digits, underscores and dashes replacing others by a dash */
  11.     $s = preg_replace('#[^a-z0-9_-]#', '-', $s);
  12.  
  13.     /* replace consecutive dashes by one */
  14.     $s = preg_replace('/[-]+/', '-', $s);
  15.  
  16.     /* remove a dash at the beginning or at the end */
  17.     $s = preg_replace('/^-|-$/', '', $s);
  18.  
  19.     if (!$strict) {
  20.         return $s;
  21.     }
  22.  
  23.     /* remove words which are too short */
  24.     $r = array();
  25.     foreach (explode('-', $s) as $w)    {
  26.         if (strlen($w) > 2) {
  27.             $r[] = $w;
  28.         }
  29.     }
  30.  
  31.     return implode('-', $r);
  32. }

strtofname transforme $s en un nom de fichier. L'éditeur utilise cette fonction pour générer une URL à partir du titre d'un nœud. Si $strict vaut true, strtofname élimine les mots de moins de 3 lettres.

  1. function nodeeditor($lang, $clang, $node_id) {

nodeeditor a 3 paramètres : la langue de l'éditeur, la langue du contenu et le numéro du nœud à éditer.

  1.     $action='init';
  2.     if (isset($_POST['node_edit'])) {
  3.         $action='edit';
  4.     }
  5.  
  6.     $node_name=$node_title=$node_abstract=$node_cloud=false;

Initialise $action à 'edit' si l'utilisateur a appuyé sur le bouton Éditer ou à 'init' par défaut si le formulaire est simplement affiché. Initialise toutes les données transmises dans le formulaire avant de le lire.

  1.     switch($action) {
  2.         case 'init':
  3.         case 'reset':
  4.             $r = node_get($clang, $node_id, false);
  5.             if ($r) {
  6.                 extract($r);
  7.             }
  8.             break;
  9.         case 'edit':
  10.             if (isset($_POST['node_title'])) {
  11.                 $node_title=readarg($_POST['node_title']);
  12.             }
  13.             if (isset($_POST['node_name'])) {
  14.                 $node_name=strtofname(readarg($_POST['node_name']));
  15.             }
  16.             if (empty($node_name) and !empty($node_title)) {
  17.                 $node_name = strtofname($node_title);
  18.             }
  19.             if (isset($_POST['node_abstract'])) {
  20.                 $node_abstract=readarg($_POST['node_abstract']);
  21.             }
  22.             if (isset($_POST['node_cloud'])) {
  23.                 $node_cloud=readarg($_POST['node_cloud'], true, false); // trim but DON'T strip!
  24.                 preg_match_all('/(\S+)/', $node_cloud, $r);
  25.                 $node_cloud=implode(' ', array_unique($r[0]));
  26.             }
  27.             break;
  28.         default:
  29.             break;
  30.     }

Extrait les champs de saisie du formulaire et les filtre avec readarg. Le champ 'node_name' est filtré avec la fonction strtofname. S'il est vide, il est automatiquement rempli à partir du champ 'node_title'. Remarquez que le champ 'node_cloud' n'est par filtré avec la fonction strip_tags pour permettre d'associer une balise comme mot clé à un nœud. Le contenu du champ 'node_cloud' est coupé en mots puis filtrer afin d'éliminer les doublons.

  1.     $missing_node_name=false;
  2.     $bad_node_name=false;
  3.  
  4.     $missing_node_title=false;
  5.  
  6.     switch($action) {
  7.         case 'edit':
  8.             if (empty($node_name)) {
  9.                 $missing_node_name = true;
  10.             }
  11.             else if (!preg_match('#^[\w-]{3,}$#', $node_name)) {
  12.                 $bad_node_name = true;
  13.             }
  14.             if (empty($node_title)) {
  15.                 $missing_node_title = true;
  16.             }
  17.             break;
  18.         default:
  19.             break;
  20.     }

Contrôle le contenu de $node_name et $node_title.

  1.     switch($action) {
  2.         case 'edit':
  3.             if ($missing_node_name or $bad_node_name or $missing_node_title) {
  4.                 break;
  5.             }
  6.  
  7.             $r = node_set($clang, $node_id, $node_name, $node_title, $node_abstract, $node_cloud);
  8.  
  9.             if (!$r) {
  10.                 break;
  11.             }
  12.  
  13.             break;
  14.  
  15.         default:
  16.             break;
  17.     }

Vérifie qu'aucune erreur n'a été détectée puis modifie le contenu du nœud dans la BD en appelant la fonction node_set.

  1.     $errors = compact('missing_node_name', 'bad_node_name', 'missing_node_title');
  2.  
  3.     $output = view('editing/nodeeditor', $lang, compact('clang', 'node_name', 'node_title', 'node_abstract', 'node_cloud', 'errors'));
  4.  
  5.     return $output;
  6. }

Prépare tous les paramètres de la vue, la génère et retourne son contenu.

Ajoutez la vue de l'éditeur en français dans le dossier views/fr/editing avec le contenu suivant :

  1. /cms/site24
    1. views
      1. fr
        1. editing
          1. editnode.phtml
  1. <?php extract($errors); ?>
  2. <form class="compact" action="" method="post">
  3. <input name="clang" type="hidden" value="<?php echo $clang; ?>" />
  4. <p>
  5. <?php if (in_array('fr', $supported_languages)): ?>
  6. <input name="fr" type="image" src="<?php echo $base_path; ?>/images/theme/flags/fr.png" alt="fr" title="Français"/>
  7. <?php endif; ?>
  8. <?php if (in_array('en', $supported_languages)): ?>
  9. <input name="en" type="image" src="<?php echo $base_path; ?>/images/theme/flags/en.png" alt="en" title="English"/>
  10. <?php endif; ?>
  11. </p>
  12. <p>
  13. <input id="node_title" name="node_title" type="text" size="40" maxlength="100" value="<?php echo htmlspecialchars($node_title, ENT_COMPAT, 'UTF-8'); ?>" title="Titre" onkeypress="return submitonenter(event, 'node_edit')"/>
  14. <label>URL :</label>
  15. <input id="node_name" name="node_name" type="text" size="40" maxlength="100" value="<?php echo $node_name; ?>" onkeypress="return focusonenter(event, 'node_title')"/>
  16. </p>
  17. <p><label>Extrait :</label></p>
  18. <p>
  19. <textarea name="node_abstract" cols="80" rows="3"><?php echo htmlspecialchars($node_abstract, ENT_COMPAT, 'UTF-8'); ?></textarea>
  20. </p>
  21. <p><label>Nuage :</label></p>
  22. <p>
  23. <textarea name="node_cloud" cols="80" rows="2" ><?php echo htmlspecialchars($node_cloud, ENT_COMPAT, 'UTF-8'); ?></textarea>
  24. </p>
  25. <p>
  26. <input id="node_edit" name="node_edit" type="submit" value="Éditer" />
  27. </p>
  28. <?php if ($missing_node_title or $missing_node_name or $bad_node_name): ?>
  29. <div class="alert">
  30. <?php if ($missing_node_title): ?>
  31. <p>Vous n'avez pas saisi le titre.</p>
  32. <?php endif; ?>
  33. <?php if ($missing_node_name): ?>
  34. <p>Spécifiez un nom pour le lien.</p>
  35. <?php elseif ($bad_node_name): ?>
  36. <p>Le nom du lien est invalide.</p>
  37. <?php endif; ?>
  38. </div>
  39. <?php endif; ?>
  40. </form>

Remarquez comme le contenu des champs est protégé avec la fonction PHP htmlspecialchars.

Ajoutez la vue de l'éditeur en anglais dans le dossier views/en/editing avec le contenu suivant :

  1. /cms/site24
    1. views
      1. en
        1. editing
          1. editnode.phtml
  1. <?php extract($errors); ?>
  2. <form class="compact" action="" method="post">
  3. <input name="clang" type="hidden" value="<?php echo $clang; ?>" />
  4. <p>
  5. <?php if (in_array('fr', $supported_languages)): ?>
  6. <input name="fr" type="image" src="<?php echo $base_path; ?>/images/theme/flags/fr.png" alt="fr" title="Français"/>
  7. <?php endif; ?>
  8. <?php if (in_array('en', $supported_languages)): ?>
  9. <input name="en" type="image" src="<?php echo $base_path; ?>/images/theme/flags/en.png" alt="en" title="English"/>
  10. <?php endif; ?>
  11. </p>
  12. <p>
  13. <input id="node_title" name="node_title" type="text" size="40" maxlength="100" value="<?php echo htmlspecialchars($node_title, ENT_COMPAT, 'UTF-8'); ?>" title="Title" onkeypress="return submitonenter(event, 'node_edit')"/>
  14. <label>URL:</label>
  15. <input id="node_name" name="node_name" type="text" size="40" maxlength="100" value="<?php echo $node_name; ?>" onkeypress="return focusonenter(event, 'node_title')"/>
  16. </p>
  17. <p><label>Abstract:</label></p>
  18. <p>
  19. <textarea name="node_abstract" cols="80" rows="3"><?php echo htmlspecialchars($node_abstract, ENT_COMPAT, 'UTF-8'); ?></textarea>
  20. </p>
  21. <p><label>Cloud:</label></p>
  22. <p>
  23. <textarea name="node_cloud" cols="80" rows="2" ><?php echo htmlspecialchars($node_cloud, ENT_COMPAT, 'UTF-8'); ?></textarea>
  24. </p>
  25. <p>
  26. <input id="node_edit" name="node_edit" type="submit" value="Edit" />
  27. </p>
  28. <?php if ($missing_node_title or $missing_node_name or $bad_node_name): ?>
  29. <div class="alert">
  30. <?php if ($missing_node_title): ?>
  31. <p>You didn't input the title.</p>
  32. <?php endif; ?>
  33. <?php if ($missing_node_name): ?>
  34. <p>Specify a name for the link.</p>
  35. <?php elseif ($bad_node_name): ?>
  36. <p>The name of the link is invalid.</p>
  37. <?php endif; ?>
  38. </div>
  39. <?php endif; ?>
  40. </form>

Éditez le fichier models/node.inc et ajoutez la fonction node_set :

  1. function node_set($lang, $node_id, $node_name, $node_title, $node_abstract, $node_cloud) {
  2.     $tabnode=db_prefix_table('node');
  3.  
  4.     $sql="UPDATE $tabnode SET modified=NOW() WHERE node_id=$node_id LIMIT 1";
  5.     $r = db_update($sql);
  6.  
  7.     if (!$r) {
  8.         return false;
  9.     }
  10.  
  11.     $sqllang=db_sql_arg($lang, false);
  12.     $sqlname=db_sql_arg($node_name, true);
  13.     $sqltitle=db_sql_arg($node_title, true);
  14.     $sqlabstract=db_sql_arg($node_abstract, true, true);
  15.     $sqlcloud=db_sql_arg($node_cloud, true, true);
  16.  
  17.     $tabnodelocale=db_prefix_table('node_locale');
  18.  
  19.     $sql="INSERT $tabnodelocale SET node_id=$node_id, locale=$sqllang, name=$sqlname, title=$sqltitle, abstract=$sqlabstract, cloud=$sqlcloud ON DUPLICATE KEY UPDATE node_id=LAST_INSERT_ID(node_id), locale=VALUES(locale), name=VALUES(name), title=VALUES(title), abstract=VALUES(abstract), cloud=VALUES(cloud)";
  20.  
  21.     $r = db_insert($sql);
  22.  
  23.     return $r;
  24. }

node_set commence par mettre à jour le champ modified du nœud $node_id dans la table node. Si l'opération échoue, le nœud $node_id n'existe pas et node_set retourne false. node_set insère ensuite une entrée dans la table node_locale ou remplace les données du nœud existant. node_set retourne true ou false en cas d'erreur.

  1.     $is_writer = user_has_role('writer');

Met $is_writer à true si l'utilisateur est autorisé à modifier le contenu du site.

  1.                 case 'edit':
  2.                     if ($param) {
  3.                         if ($is_writer) {
  4.                             $edit_page=$param;
  5.                             $edit=true;
  6.                         }
  7.                     }
  8.                     break;

Ajoute un lien pour éditer un contenu si $components contient 'edit' et si l'utilisateur a le droit de l'éditer. $param définit l'URL du lien.

  1.                 case 'view':
  2.                     if ($param) {
  3.                         if ($is_writer) {
  4.                             $view_page=$param;
  5.                             $view=true;
  6.                         }
  7.                     }
  8.                     break;

Ajoute un lien pour afficher un contenu si $components contient 'view' et si l'utilisateur a le droit de l'éditer. $param définit l'URL du lien.

  1.     if ($contact or $login or $logout or $edit or $view or $validate) {
  2.         $menu = view('bannermenu', $lang, compact('contact', 'contact_page', 'edit', 'edit_page', 'view', 'view_page', 'validate', 'validate_page', 'logout', 'nobody_page', 'login', 'user_page'));
  3.     }
  4.  
  5.     $output = view('banner', false, compact('logo', 'menu', 'languages'));
  6.  
  7.     return $output;
  8. }

Fabrique la vue du bandeau en passant tous les paramètres calculés plus haut. Génère le contenu du bandeau et le retourne.

Complétez les vues en français et en anglais du menu :

  1. <?php if ($edit): ?>
  2. <li><a id="edit" href="<?php echo $edit_page; ?>" rel="nofollow" title="Éditer"><span>Éditer</span></a></li>
  3. <?php elseif ($view): ?>
  4. <li><a id="view" href="<?php echo $view_page; ?>" rel="nofollow" title="Voir"><span>Afficher</span></a></li>
  5. <?php endif; ?>
  1. <?php if ($edit): ?>
  2. <li><a id="edit" href="<?php echo $edit_page; ?>" rel="nofollow" title="Edit"><span>Edit</span></a></li>
  3. <?php elseif ($view): ?>
  4. <li><a id="view" href="<?php echo $view_page; ?>" rel="nofollow" title="View"><span>View</span></a></li>
  5. <?php endif; ?>

Créez le dossier theme dans le dossier images puis les dossiers icons et flags dans le dossier images/theme. Depuis le dossier buttons, déplacez les fichiers cancel.png, check.png, mail.png et user.png dans le dossier images/theme/icons puis les fichiers en.png et fr.png dans le dossier images/theme/flags. Détruisez le dossier buttons. Enfin, déplacez le fichier heading.png du dossier images dans le dossier images/theme.

  1. /cms/site24
    1. buttons
    2. images
      1. theme
        1. icons
          1. cancel.png
          2. check.png
          3. mail.png
          4. user.png
        2. flags
          1. en.png
          2. fr.png
        3. heading.png

Ajoutez les icônes edit.png et web.png dans le dossier images/theme/icons :

  1. /cms/site24
    1. images
      1. theme
        1. icons
          1. edit.png
          2. web.png

Reportez ces modifications dans le fichier css/theme.css :

  1. h3 {line-height:24px;background:transparent url(../images/theme/heading.png) no-repeat;text-indent:30px;margin:0 0 0.5em 0;}

Déplace l'image affichée en avant des titres <h3> dans le dossier images/theme.

  1. #bannermenu {width:160px;float:left;margin-top:13px;margin-left:40px;}
  2. #bannermenu #mail {width:24px;height:24px;float:right;margin-left:6px;background:transparent url(../images/theme/icons/mail.png) no-repeat center center;}
  3. #bannermenu #exit {width:24px;height:24px;float:left;margin-right:6px;background:transparent url(../images/theme/icons/cancel.png) no-repeat center center;}
  4. #bannermenu #enter {width:24px;height:24px;float:right;margin-right:6px;background:transparent url(../images/theme/icons/user.png) no-repeat center center;}
  5. #bannermenu #edit {width:24px;height:24px;float:left;margin-right:6px;background:transparent url(../images/theme/icons/edit.png) no-repeat center center;}
  6. #bannermenu #view {width:24px;height:24px;float:left;margin-right:6px;background:transparent url(../images/theme/icons/web.png) no-repeat center center;}
  7. #bannermenu #validate {width:24px;height:24px;float:left;margin-right:6px;background:transparent url(../images/theme/icons/check.png) no-repeat center center;}

Associe les liens dans le menu du bandeau à leurs icônes dans le dossier images/theme/icons.

  1. #french {width:32px;height:24px;float:left;margin-right:2px;background:transparent url(../images/theme/flags/fr.png) no-repeat center center;}
  2. #english {width:32px;height:24px;float:left;margin-right:2px;background:transparent url(../images/theme/flags/en.png) no-repeat center center;}

Déplace les images des drapeaux dans le dossier images/theme/flags.

  1. div.alert {color:#333333;background-color:#ffcccc;padding:0.5em 1em 0.5em 1em;}
  2. div.warning {color:#333333;background-color:#ffffe0;padding:0.5em 1em 0.5em 1em;}
  3. div.alert p, div.warning p {margin-top:0.5em; margin-bottom:0.5em;}

Définit le style des messages d'erreur.

Entrez http://localhost/cms/site24/fr dans la barre d'adresse de votre navigateur. Identifiez-vous avec le nom foobar et le mot de passe f00bar. Cliquez sur le lien Informations légales dans la page d'accueil. Appuyez sur le bouton Éditer dans le bandeau de la page. Effacez l'URL, changez le titre du nœud, sa description, ajoutez un mot clé dans le nuage puis appuyez sur Éditer. NOTE : Si vous changer l'URL, pensez à modifier le lien dans le pied de page. Éditez le contenu en anglais. Entrez http://localhost/cms/site24/en/edit/node/1 dans la barre d'adresse de votre navigateur pour tester l'éditeur en anglais.

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