Classement du contenu
Créez site20 en copiant site19.
- /cms
- ...
- site19
- site20
Dans ce chapitre, nous allons classer les nœuds en fils.
Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site20/fr/fil/1 dans la barre d'adresse de votre navigateur. Le site affiche le contenu du fil 1 en français. Entrez http://www.frasq.org/cms/site20/en/thread/1 pour afficher sa traduction en anglais.
Un fil a un titre, un nom, un extrait et un nuage de mots qui lui sont associés. Un fil contient une liste ordonnée de nœuds. Cliquez sur le lien Informations légales pour afficher le nœud 1.
Démarrez le processeur de commandes de MySQL et entrez dans la BD du site :
$ mysql -u root -p
mysql> use frasqdb2;
NOTE : Utilisez phpMyAdmin pour plus de confort.
Ajoutez la table thread
puis la table thread_locale
à la BD du site :
thread_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INT(10) NOT NULL DEFAULT '1',
thread_type enum('thread') NOT NULL DEFAULT 'thread',
created datetime NOT NULL,
modified datetime NOT NULL,
PRIMARY KEY (thread_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Un thread
contient les propriétés d'un fil communes à toutes les langues : son identifiant, l'identifiant de l'utilisateur qui l'a modifié pour la dernière fois, le type du fil, ses dates de création et de modification.
Le type d'un fil permettra une interprétation particulière de son contenu - livre, blog, forum, wiki, etc.
La clé primaire d'un thread
est son identifiant.
thread_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
locale enum('fr','en') NOT NULL DEFAULT 'fr',
name VARCHAR(100) NOT NULL,
title VARCHAR(100) NOT NULL,
abstract text,
cloud text,
PRIMARY KEY (thread_id,locale)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Un thread_locale
contient les propriétés d'un fil qui dépendent de la langue : la désignation de la langue du contenu, le nom du fil, son titre, l'extrait et la liste de mots associés au fil.
L'identifiant d'un thread_locale
correspond à l'identifiant d'un thread
.
Les désignations des langues doivent correspondre aux langues listées par le paramètre de configuration $supported_languages
défini dans le fichier includes/config.inc.
La clé primaire d'un thread_locale
est son identifiant et la désignation de la langue de son contenu.
Le lien entre un fil et les nœuds qu'il contient est fait par la table thread_node
:
thread_id INT(10) UNSIGNED NOT NULL,
node_id INT(10) UNSIGNED NOT NULL,
`number` INT(4) UNSIGNED NOT NULL,
PRIMARY KEY (thread_id,node_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Un thread_node
liste et ordonne les nœuds d'un fil.
L'identifiant d'un thread_id
correspond à l'identifiant d'un thread
.
node_id
correspond à l'identifiant d'un nœud dans node
.
La clé primaire d'un thread_node
est l'identifiant d'un fil et l'identifiant d'un nœud.
Créez un premier fil :
(1, 1, 'thread', NOW(), NOW());
Le fil 1 est créé par l'utilisateur 1, l'administrateur du site. Vérifiez dans la table user
.
Ajoutez sa description en français :
(1, 'fr', 'classeur', 'Classeur', 'Articles, notes et pages diverses.', 'articles notes informations');
Ajoutez la version en anglais :
(1, 'en', 'folder', 'Folder', 'Articles, notes and various pages.', 'articles notes information');
Associez le nœud 1 avec le fil 1 et placez-le en première position :
Essayez quelques requêtes sur la BD :
Vérifie que le fil 1 a bien été créé.
Vérifie le nom du fil 1 en anglais.
Vérifie que le nœud 1 appartient au fil 1.
Retourne l'identifiant du nœud 1 du fil 1 d'après son nom en anglais.
Retourne toutes les propriétés de tous les nœuds du fil 1 en français.
Ajoutez le fichier thread.inc dans le dossier models avec le contenu suivant :
- function thread_id($thread) {
- if (is_numeric($thread)) {
- $tabthread=db_prefix_table('thread');
- $sql="SELECT thread_id FROM $tabthread WHERE thread_id=$thread LIMIT 1";
- }
- else {
- $sqlname=db_sql_arg($thread, true);
- $tabthreadlocale=db_prefix_table('thread_locale');
- $sql="SELECT thread_id FROM $tabthreadlocale WHERE name=$sqlname LIMIT 1";
- }
- $r = db_query($sql);
- return $r ? $r[0]['thread_id'] : false;
- }
thread_id
retourne le thread_id
du fil dont l'identifiant ou le nom est $thread
, ou false
si un fil avec thread_id
ou thread_name
à la valeur $thread
n'existe pas.
- function thread_node_id($thread_id, $node) {
- if (is_numeric($node)) {
- $tabthreadnode=db_prefix_table('thread_node');
- $sql="SELECT tn.node_id AS node_id FROM $tabthreadnode tn WHERE tn.thread_id=$thread_id AND tn.node_id=$node LIMIT 1";
- }
- else {
- $sqlname = db_sql_arg($node, true);
- $tabthreadnode=db_prefix_table('thread_node');
- $tabnodelocale=db_prefix_table('node_locale');
- $sql="SELECT tn.node_id AS node_id FROM $tabthreadnode tn JOIN $tabnodelocale nl ON nl.node_id=tn.node_id WHERE tn.thread_id=$thread_id AND nl.name=$sqlname LIMIT 1";
- }
- $r = db_query($sql);
- return $r ? $r[0]['node_id'] : false;
- }
thread_node_id
retourne le node_id
du nœud contenu dans le fil $thread_id
dont l'identifiant ou le nom est $node
, ou false
si le fil $thread_id
ne contient pas un nom avec node_id
ou node_name
à la valeur $node
.
- function thread_get($lang, $thread_id) {
- $sqllang=db_sql_arg($lang, false);
- $tabthread=db_prefix_table('thread');
- $tabthreadlocale=db_prefix_table('thread_locale');
- $sql="SELECT tloc.name AS thread_name, tloc.title AS thread_title, tloc.abstract AS thread_abstract, tloc.cloud AS thread_cloud, t.thread_type AS thread_type, UNIX_TIMESTAMP(t.created) AS thread_created, UNIX_TIMESTAMP(t.modified) AS thread_modified FROM $tabthread t JOIN $tabthreadlocale tloc ON tloc.thread_id=t.thread_id AND tloc.locale=$sqllang WHERE t.thread_id=$thread_id LIMIT 1";
- $r = db_query($sql);
- return $r ? $r[0] : false;
- }
thread_get
retourne tous les attributs pour la langue $lang
du fil dont l'identifiant est $thread_id
, ou false
en cas d'erreur.
Remarquez que les champs thread_created
et thread_modified
sont convertis en temps Unix.
- function thread_get_contents($lang, $thread_id) {
- $sqllang=db_sql_arg($lang, false);
- $tabthreadnode=db_prefix_table('thread_node');
- $tabnodelocale=db_prefix_table('node_locale');
- $sql="SELECT tn.node_id, tn.number AS node_number, nl.name AS node_name, nl.title AS node_title, nl.abstract AS node_abstract, nl.cloud AS node_cloud FROM $tabthreadnode tn LEFT JOIN $tabnodelocale nl ON nl.node_id=tn.node_id AND nl.locale=$sqllang WHERE tn.thread_id=$thread_id ORDER BY tn.number";
- $r = db_query($sql);
- return $r;
- }
thread_get_contents
retourne le contenu du fil $thread_id
pour la langue $lang
, ou false
en cas d'erreur.
Créez l'action thread
en ajoutant le fichier thread.php puis le fichier threadsummary.php dans le dossier actions avec les contenus suivants :
- /cms/site20
- actions
- thread.php
- threadsummary.php
- actions
- function thread($lang, $arglist=false) {
- $thread=false;
- if (is_array($arglist)) {
- if (isset($arglist[0])) {
- $thread=$arglist[0];
- }
- }
- if (!$thread) {
- return run('error/notfound', $lang);
- }
- require_once 'actions/threadsummary.php';
- return threadsummary($lang, $thread);
- }
- require_once 'models/thread.inc';
- function threadsummary($lang, $thread) {
- $thread_id = thread_id($thread);
- if (!$thread_id) {
- return run('error/notfound', $lang);
- }
- $r = thread_get($lang, $thread_id);
- if (!$r) {
- return run('error/notfound', $lang);
- }
- extract($r); /* thread_name thread_title thread_abstract thread_cloud */
- head('title', $thread_title);
- head('description', $thread_abstract);
- head('keywords', $thread_cloud);
- $validate=url('thread', $lang) . '/'. $thread_name;
- $banner = build('banner', $lang, compact('validate'));
- $r = thread_get_contents($lang, $thread_id);
- $thread_contents = array();
- if ($r) {
- $node_uri = url('node', $lang);
- foreach ($r as $c) {
- extract($c); /* node_id node_name node_title node_number */
- $node_url = $node_uri . '/' . $node_id;
- $thread_contents[] = compact('node_title' , 'node_url');
- }
- }
- $content = view('threadsummary', $lang, compact('thread_title', 'thread_abstract', 'thread_cloud', 'thread_contents'));
- $output = layout('standard', compact('banner', 'content'));
- return $output;
- }
Pour donner accès à l'action thread
, ajoutez un alias par langue dans le fichier includes/aliases.inc :
- 'fil' => 'thread',
- 'thread' => 'thread',
Ajoutez la vue du sommaire d'un fil dans les dossiers views/fr pour la version en français et views/en pour la version en anglais :
- /cms/site20
- views
- fr
- threadsummary.phtml
- en
- threadsummary.phtml
- fr
- views
- <h3><?php echo htmlspecialchars($thread_title, ENT_COMPAT, 'UTF-8'); ?></h3>
- <?php if ($thread_abstract): ?>
- <h5>Extrait</h5>
- <p><?php echo htmlspecialchars($thread_abstract, ENT_COMPAT, 'UTF-8'); ?></p>
- <?php endif; ?>
- <?php if ($thread_cloud): ?>
- <h6>Nuage</h6>
- <p class="smaller"><?php echo htmlspecialchars($thread_cloud, ENT_COMPAT, 'UTF-8'); ?></p>
- <?php endif; ?>
- <h4>Contenu</h4>
- <ol>
- <?php foreach ($thread_contents as $c): ?>
- <?php extract($c); /* node_title node_url */ ?>
- <li><a href="<?php echo $node_url; ?>"><?php echo htmlspecialchars($node_title, ENT_COMPAT, 'UTF-8'); ?></a></li>
- <?php endforeach; ?>
- </ol>
- <h3><?php echo htmlspecialchars($thread_title, ENT_COMPAT, 'UTF-8'); ?></h3>
- <?php if ($thread_abstract): ?>
- <h5>Abstract</h5>
- <p><?php echo htmlspecialchars($thread_abstract, ENT_COMPAT, 'UTF-8'); ?></p>
- <?php endif; ?>
- <?php if ($thread_cloud): ?>
- <h6>Cloud</h6>
- <p class="smaller"><?php echo htmlspecialchars($thread_cloud, ENT_COMPAT, 'UTF-8'); ?></p>
- <?php endif; ?>
- <h4>Contents</h4>
- <ol>
- <?php foreach ($thread_contents as $c): ?>
- <?php extract($c); /* node_title node_url */ ?>
- <li><a href="<?php echo $node_url; ?>"><?php echo htmlspecialchars($node_title, ENT_COMPAT, 'UTF-8'); ?></a></li>
- <?php endforeach; ?>
- </ol>
Entrez http://localhost/cms/site20/fr/fil/1 puis http://localhost/cms/site20/en/node/1 dans la barre d'adresse de votre navigateur.
Commentaires