Édition du contenu d'un fil
Créez site27 en copiant site26.
- /cms
- ...
- site26
- site27
Dans ce chapitre, nous allons créer l'éditeur du contenu d'un fil.
Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site27 dans la barre d'adresse de votre navigateur.
Identifiez-vous avec le nom foobar
et le mot de passe f00bar
.
Affichez puis éditez la page Informations légales.
Cliquez sur le nom du fil dans le coin en haut à droite de la page.
NOTE : Dans cette version de démonstration, le contenu du site ne peut pas être modifié.
Éditez le fichier models/thread.inc et ajoutez les fonctions thread_create_node
, thread_delete_node
et thread_set_node_number
avec les contenus suivants :
- function thread_create_node($lang, $thread_id, $node_name, $node_title, $node_number=0) {
- $tabthreadnode=db_prefix_table('thread_node');
- $sql="SELECT COUNT(*)+1 AS n FROM $tabthreadnode WHERE thread_id=$thread_id";
- $r = db_query($sql);
- if (!$r) {
- return false;
- }
- $n = $r[0]['n'];
- if ($node_number < 1 or $node_number > $n) {
- $node_number = $n;
- }
- $r = node_create($lang, $node_name, $node_title);
- if (!$r) {
- return false;
- }
- extract($r); /* node_id */
- if ($node_number != $n) {
- $sql="UPDATE $tabthreadnode SET number=number+1 WHERE thread_id=$thread_id AND number >= $node_number ORDER BY number";
- db_update($sql);
- }
- $sql="INSERT $tabthreadnode SET thread_id=$thread_id, node_id=$node_id, number=$node_number";
- $r = db_insert($sql);
- return $r ? compact('node_id', 'node_number') : false;
- }
thread_create_node
ajoute un nouveau nœud au fil $thread_id
avec $node_url
comme URL et $node_title
comme titre pour la langue $lang
.
Le nouveau nœud est placé à la position $number
dans le fil ou, si $number
n'est pas spécifié, à la fin du fil.
thread_create_node
retourne l'identifiant du nouveau nœud et sa position dans le fil ou false
en cas d'erreur.
thread_create_node
vérifie que le paramètre $number
est bien compris entre 1 et le nombre de nœuds du fil plus un. Si $number
n'est pas spécifié ou s'il est invalide, le nœud est ajouté à la fin du fil.
Une fois le nœud créé par node_create
, si le nœud n'est pas ajouté à la fin du fil, tous les nœuds suivants la position du nouveau nœud sont décalés.
thread_create_node
termine la création du nœud en l'ajoutant au fil à la position demandée.
- function thread_delete_node($thread_id, $node_id) {
- $tabthreadnode=db_prefix_table('thread_node');
- $sql="DELETE FROM $tabthreadnode WHERE thread_id=$thread_id AND node_id=$node_id LIMIT 1";
- $r = db_delete($sql);
- if (!$r) {
- return false;
- }
- $sql="SET @n=0";
- db_update($sql);
- $sql="UPDATE $tabthreadnode SET number=(@n:=@n+1) WHERE thread_id=$thread_id ORDER BY number";
- db_update($sql);
- $sql="SELECT COUNT(*) AS count FROM $tabthreadnode WHERE node_id=$node_id";
- $r = db_query($sql);
- if (!$r) {
- return false;
- }
- if ($r[0]['count'] != 0) {
- return true;
- }
- $r = node_delete($node_id);
- if (!$r) {
- return false;
- }
- return true;
- }
thread_delete_node
retire le nœud $node_id
du fil $thread_id
et le détruit s'il n'est contenu pas aucun autre fil.
thread_delete_node
retourne true
ou false
en cas d'erreur.
thread_delete_node
commence par supprimer le lien entre le fil et le nœud puis renumérote tous les nœuds du fil.
thread_delete_node
compte ensuite le nombre de fils qui contiennent $node_id
et détruit $node_id
avec node_delete
si la réponse est 0.
- function thread_set_node_number($thread_id, $node_id, $number) {
- $tabthreadnode=db_prefix_table('thread_node');
- $sql="UPDATE $tabthreadnode SET number=$number WHERE thread_id=$thread_id AND node_id=$node_id LIMIT 1";
- $r = db_update($sql);
- return $r;
- }
thread_set_node_number
met le numéro d'ordre du nœud $node_id
du fil $thread_id
à $number
.
- else if (isset($_POST['thread_reorder'])) {
- $action='reorder';
- }
- else if (isset($_POST['node_create'])) {
- $action='create';
- }
- else if (isset($_POST['node_delete'])) {
- $action='delete';
- }
- $new_node_name=$new_node_title=$new_node_number=false;
- $old_node_number=false;
- $thread_contents = false;
- $p=false;
- case 'create':
- case 'delete':
- case 'reorder':
- if (isset($_POST['new_node_title'])) {
- $new_node_title=readarg($_POST['new_node_title']);
- $new_node_name = strtofname($new_node_title);
- }
- if (isset($_POST['new_node_number'])) {
- $new_node_number=readarg($_POST['new_node_number']);
- }
- if (isset($_POST['old_node_number'])) {
- $old_node_number=readarg($_POST['old_node_number']);
- }
- if (isset($_POST['p'])) {
- $p=$_POST['p']; // DON'T readarg!
- }
- $r = thread_get_contents($clang, $thread_id, false); /* node_id node_name node_title node_cloud node_number ... */
- if (count($p) != count($r)) {
- $p = false;
- }
- if ($r) {
- $pos=1;
- $thread_contents = array();
- $thread_url = url('threadedit', $lang) . '/'. $thread_id;
- foreach ($r as $c) {
- $c['node_url'] = $thread_url . '/' . $c['node_id'];
- $c['pos'] = $p ? $p[$pos] : $pos;
- $thread_contents[$pos] = $c;
- $pos++;
- }
- }
- $missing_new_node_title=false;
- $bad_new_node_title=false;
- $bad_new_node_number=false;
- $missing_old_node_number=false;
- $bad_old_node_number=false;
- case 'create':
- if (empty($new_node_title)) {
- $missing_new_node_title = true;
- }
- else if (empty($new_node_name)) {
- $bad_new_node_title = true;
- }
- else if (!preg_match('#^[\w-]{3,}$#', $new_node_name)) {
- $bad_new_node_title = true;
- }
- if (empty($new_node_number)) {
- $new_node_number = false;
- }
- else if (!is_numeric($new_node_number)) {
- $bad_new_node_number = true;
- }
- else if ($new_node_number < 1 or $new_node_number > count($thread_contents) + 1) {
- $bad_new_node_number = true;
- }
- break;
- case 'delete':
- if (empty($old_node_number)) {
- $missing_old_node_number = true;
- }
- else if (!is_numeric($old_node_number)) {
- $bad_old_node_number = true;
- }
- else if ($old_node_number < 1 or $old_node_number > count($thread_contents)) {
- $bad_old_node_number = true;
- }
- break;
- case 'reorder':
- break;
- case 'create':
- if ($missing_new_node_title or $bad_new_node_title or $bad_new_node_number) {
- break;
- }
- $np = thread_create_node($clang, $thread_id, $new_node_name, $new_node_title, $new_node_number);
- if (!$np) {
- break;
- }
- extract($np); /* node_id node_number node_ignored */
- $node_title = $new_node_title;
- $node_url = url('threadedit', $lang) . '/'. $thread_id . '/' . $node_id;
- $pos = $node_number;
- if ($thread_contents) {
- foreach ($thread_contents as &$c) {
- if ($c['node_number'] >= $pos) {
- $c['node_number']++;
- }
- if ($c['pos'] >= $pos) {
- $c['pos']++;
- }
- }
- array_splice($thread_contents, $pos-1, 0, array(compact('node_id', 'node_title', 'node_number', 'node_url', 'pos')));
- }
- else {
- $pos=1;
- $thread_contents=array($pos => compact('node_id', 'node_title', 'node_number', 'node_url', 'pos'));
- }
- break;
- case 'delete':
- if ($missing_old_node_number or $bad_old_node_number) {
- break;
- }
- if (!$confirmed) {
- $confirm_delete_node=true;
- break;
- }
- $node_id = $thread_contents[$old_node_number]['node_id'];
- $r = thread_delete_node($thread_id, $node_id);
- if (!$r) {
- break;
- }
- unset($thread_contents[$old_node_number]);
- $thread_contents = array_values($thread_contents);
- foreach ($thread_contents as &$c) {
- if ($c['node_number'] >= $old_node_number) {
- $c['node_number']--;
- }
- if ($c['pos'] >= $old_node_number) {
- $c['pos']--;
- }
- }
- $old_node_number = false;
- break;
- case 'reorder':
- if (!$p) {
- break;
- }
- $neworder=range(1, count($p));
- array_multisort($p, SORT_NUMERIC, $neworder);
- $number=1;
- $nc=array();
- foreach ($neworder as $i) {
- $c = &$thread_contents[$i];
- if ($c['node_number'] != $number) {
- thread_set_node_number($thread_id, $c['node_id'], $number);
- $c['node_number'] = $number;
- }
- $c['pos']=$number;
- $nc[$number++] = $c;
- }
- $thread_contents = $nc;
- break;
- $errors = compact('missing_thread_name', 'bad_thread_name', 'missing_thread_title', 'missing_thread_type', 'bad_thread_type', 'missing_new_node_title', 'bad_new_node_title', 'bad_new_node_number', 'missing_old_node_number', 'bad_old_node_number');
- $content = view('editing/threadeditsummary', $lang, compact('clang', 'thread_type', 'thread_name', 'thread_title', 'thread_abstract', 'thread_cloud', 'thread_contents', 'new_node_name', 'new_node_title', 'new_node_number', 'old_node_number', 'errors'));
- <h4>Contenu</h4>
- <p>
- <input id="node_create" name="node_create" type="submit" value="Ajouter" />
- le contenu
- <input id="new_node_title" name="new_node_title" type="text" size="50" maxlength="100" value="<?php echo htmlspecialchars($new_node_title, ENT_COMPAT, 'UTF-8'); ?>" title="Titre" onkeypress="return focusonenter(event, 'new_node_number')"/>
- #
- <input id="new_node_number" name="new_node_number" type="text" size="2" maxlength="3" value="<?php echo htmlspecialchars($new_node_number, ENT_COMPAT, 'UTF-8'); ?>" title="Numéro" onkeypress="return submitonenter(event, 'node_create')"/>
- </p>
- <?php if ($missing_new_node_title or $bad_new_node_title or $bad_new_node_number): ?>
- <div class="alert">
- <?php if ($missing_new_node_title): ?>
- <p>Vous n'avez pas saisi le titre du nouveau contenu.</p>
- <?php elseif ($bad_new_node_title): ?>
- <p>Le titre du nouveau contenu est invalide.</p>
- <?php endif; ?>
- <?php if ($bad_new_node_number): ?>
- <p>Le numéro du nouveau contenu n'est pas correct.</p>
- <?php endif; ?>
- </div>
- <?php endif; ?>
- <?php if ($thread_contents): ?>
- <fieldset>
- <legend>Sommaire</legend>
- <table cellpadding="2" cellspacing="0">
- <tbody>
- <?php
- $i=1;
- $maxlen=strlen(count($thread_contents))+1;
- foreach ($thread_contents as $c) {
- extract($c); /* pos, node_title, node_number, node_url */
- $node_title = htmlspecialchars($node_title, ENT_COMPAT, 'UTF-8');
- $node_url .= '?' . 'clang=' . $clang;
- echo <<<_MARK_
- <tr><td><input name="p[$i]" type="text" size="2" maxlength="$maxlen" value="$pos" /></td><td class="aright"><a href="$node_url">$node_number</a></td><td><a href="$node_url">$node_title</a></td></tr>\n
- _MARK_;
- $i++;
- }
- ?>
- </tbody>
- </table>
- </fieldset>
- <p>
- <input id="thread_reorder" name="thread_reorder" type="submit" value="Trier" />
- la liste ou
- <input id="node_delete" name="node_delete" type="submit" value="Supprimer" />
- le contenu #
- <input id="old_node_number" name="old_node_number" type="text" size="2" maxlength="3" value="<?php echo htmlspecialchars($old_node_number, ENT_COMPAT, 'UTF-8'); ?>" title="Numéro" onkeypress="return submitonenter(event, 'node_delete')"/>
- </p>
- <?php if ($missing_old_node_number or $bad_old_node_number): ?>
- <div class="alert">
- <?php if ($missing_old_node_number): ?>
- <p>Vous n'avez pas saisi le numéro du contenu à supprimer.</p>
- <?php elseif ($bad_old_node_number): ?>
- <p>Le numéro du contenu à supprimer est incorrect.</p>
- <?php endif; ?>
- </div>
- <?php endif; ?>
- <?php endif; ?>
- </form>
- <h4>Contents</h4>
- <p>
- <input id="node_create" name="node_create" type="submit" value="Add" />
- content
- <input id="new_node_title" name="new_node_title" type="text" size="50" maxlength="100" value="<?php echo htmlspecialchars($new_node_title, ENT_COMPAT, 'UTF-8'); ?>" title="Title" onkeypress="return focusonenter(event, 'new_node_number')"/>
- #
- <input id="new_node_number" name="new_node_number" type="text" size="2" maxlength="3" value="<?php echo htmlspecialchars($new_node_number, ENT_COMPAT, 'UTF-8'); ?>" title="Number" onkeypress="return submitonenter(event, 'node_create')"/>
- </p>
- <?php if ($missing_new_node_title or $bad_new_node_title or $bad_new_node_number): ?>
- <div class="alert">
- <?php if ($missing_new_node_title): ?>
- <p>You didn't input the title of the new content.</p>
- <?php elseif ($bad_new_node_title): ?>
- <p>The title of the new content is invalid.</p>
- <?php endif; ?>
- <?php if ($bad_new_node_number): ?>
- <p>The new content number is not correct.</p>
- <?php endif; ?>
- </div>
- <?php endif; ?>
- <?php if ($thread_contents): ?>
- <fieldset>
- <legend>Summary</legend>
- <table cellpadding="2" cellspacing="0">
- <tbody>
- <?php
- $i=1;
- $maxlen=strlen(count($thread_contents))+1;
- foreach ($thread_contents as $c) {
- extract($c); /* pos, node_title, node_url, node_number */
- $node_title = htmlspecialchars($node_title, ENT_COMPAT, 'UTF-8');
- $node_url .= '?' . 'clang=' . $clang;
- echo <<<_MARK_
- <tr><td><input name="p[$i]" type="text" size="2" maxlength="$maxlen" value="$pos" /></td><td class="aright"><a href="$node_url">$node_number</a></td><td><a href="$node_url">$node_title</a></td></tr>\n
- _MARK_;
- $i++;
- }
- ?>
- </tbody>
- </table>
- </fieldset>
- <p>
- <input id="thread_reorder" name="thread_reorder" type="submit" value="Sort" />
- the list or
- <input id="node_delete" name="node_delete" type="submit" value="Delete" />
- content #
- <input id="old_node_number" name="old_node_number" type="text" size="2" maxlength="3" value="<?php echo htmlspecialchars($old_node_number, ENT_COMPAT, 'UTF-8'); ?>" title="Number" onkeypress="return submitonenter(event, 'node_delete')"/>
- </p>
- <?php if ($missing_old_node_number or $bad_old_node_number): ?>
- <div class="alert">
- <?php if ($missing_old_node_number): ?>
- <p>You didn't specify the content number to delete.</p>
- <?php elseif ($bad_old_node_number): ?>
- <p>The content number to delete is not correct.</p>
- <?php endif; ?>
- </div>
- <?php endif; ?>
- <?php endif; ?>
- </form>
Commentaires