1
36

Insertion d'un fichier

Créez site23 en copiant site22.

  1. /cms
    1. ...
    2. site22
    3. site23

Dans ce chapitre, nous allons insérer un contenu à partir d'un fichier externe.

Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site23 dans la barre d'adresse de votre navigateur. Cliquez sur la coccinelle dans les bambous. La page affiche les informations retournées par PHP sur le système hôte.

Ajoutez le fichier sysinfo.php dans le dossier files avec le contenu suivant :

  1. /cms/site23
    1. files
      1. sysinfo.php
  1. <p>PHP <?php echo phpversion(); ?><br />
  2. MySQL <?php echo mysql_get_server_info(); ?><br />
  3. <?php echo php_uname('s'); ?>&nbsp;<?php echo php_uname('r'); ?></p>

Testez le programme :

$ php -a
php> require_once 'includes/db.inc';
php> require_once 'library/db.php';
php> db_connect($db_url);
php> include 'files/sysinfo.php';
<p>PHP 5.3.2-1ubuntu4.7<br />
MySQL 5.1.41-3ubuntu12.10<br />
Linux&nbsp;2.6.32-30-generic</p>
php> quit

Créez la table content_infile :

CREATE TABLE content_infile (
  content_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  locale enum('fr','en') NOT NULL DEFAULT 'fr',
  `path` VARCHAR(200) DEFAULT NULL,
  PRIMARY KEY (content_id,locale)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Ajoutez un contenu en français et en anglais :

INSERT INTO content_infile (content_id, locale, `path`) VALUES
(1, 'fr', 'files/sysinfo.php'),
(1, 'en', 'files/sysinfo.php');

Ajoutez un nouveau node :

INSERT INTO node (node_id, user_id, created, modified) VALUES
(2, 1, NOW(), NOW());

Complétez le node par ses versions en français et en anglais dans node_locale :

INSERT INTO node_locale (node_id, locale, `name`, title, abstract, cloud) VALUES
('2', 'fr', 'informations-systeme', 'Informations système', 'version PHP MySQL Linux', 'Versions de PHP, de MySQL et du système.'),
('2', 'en', 'system-information', 'System information', 'version PHP MySQL Linux', 'PHP, MySQL and system versions.');

Ajoutez le node 2 au thread 1 :

INSERT INTO thread_node (thread_id, node_id, `number`) VALUES
('1', '2', '1');

Ajoutez le type de contenu infile à la table node_content :

ALTER TABLE node_content CHANGE content_type content_type ENUM( 'text', 'infile' )
CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT 'text';

Ajoutez le content_infile 1 au node 2 :

INSERT INTO node_content (node_id, content_id, content_type, `number`)
VALUES ('2', '1', 'infile', '1');

Essayez quelques requêtes sur la BD :

SELECT 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 thread_node tn
JOIN node n ON n.node_id=tn.node_id
JOIN node_locale nl ON nl.node_id=tn.node_id AND nl.locale='en'
WHERE tn.thread_id=1 AND tn.node_id=2
LIMIT 1;

Retourne le nœud 2 en anglais.

SELECT nc.content_id AS content_id, nc.content_type AS content_type, nc.number AS content_number, ct.text AS content_text, ct.eval AS content_eval, cin.path AS content_infile
FROM node_content nc
LEFT JOIN content_text ct ON nc.content_type = 'text'
AND ct.content_id = nc.content_id
AND ct.locale = 'fr'
LEFT JOIN content_infile cin ON nc.content_type = 'infile'
AND cin.content_id = nc.content_id
AND cin.locale = 'fr'
WHERE nc.node_id =2
ORDER BY nc.`number`;

Retourne tous les contenus du nœud 2 en français.

Modifiez le fichier models/node.inc pour ajouter la lecture de la table content_infile dans la fonction node_get_contents :

  1. function node_get_contents($lang, $node_id) {
  2.     $sqllang=db_sql_arg($lang, false);
  3.  
  4.     $tabnodecontent=db_prefix_table('node_content');
  5.     $tabcontenttext=db_prefix_table('content_text');
  6.     $tabcontentinfile=db_prefix_table('content_infile');
  7.  
  8.     $sql="SELECT nc.content_id AS content_id, nc.content_type AS content_type, nc.number AS content_number, ct.text AS content_text, ct.eval AS content_eval, cin.path AS content_infile FROM $tabnodecontent nc LEFT JOIN $tabcontenttext ct ON nc.content_type='text' AND ct.content_id=nc.content_id AND ct.locale=$sqllang LEFT JOIN $tabcontentinfile cin ON nc.content_type='infile' AND cin.content_id=nc.content_id AND cin.locale=$sqllang WHERE nc.node_id=$node_id ORDER BY nc.number";
  9.  
  10.     $r = db_query($sql);
  11.  
  12.     return $r;
  13. }

Joint le contenu de la table content_file et ajoute le champ content_infile au tableau retourné.

Modifiez le fichier blocks/nodecontent.php pour prendre en compte le type de contenu infile :

  1.                 case 'infile':
  2.                     $infile=$c['content_infile'];
  3.                     if ($infile) {
  4.                         $contents[] = compact('type', 'infile');
  5.                     }
  6.                     break;

Passe simplement le nom du fichier à la vue.

Ajoutez le traitement d'un contenu du type infile par la vue dans le fichier views/nodecontent.phtml :

  1. foreach ($contents as $c) {
  2.     switch($c['type']) {
  3.         case 'text':
  4.             $s = $c['text'];
  5.             echo $s, PHP_EOL;
  6.             break;
  7.         case 'infile':
  8.             include $c['infile'];
  9.             break;
  10.         default:
  11.             break;
  12.     }
  13. }

Insère le fichier avec la fonction include de PHP. IMPORTANT : Le contenu du fichier est évalué par PHP.

Ajoutez la vue qui construit le panneau dans les dossiers views/fr pour la version en français et views/en pour la version en anglais :

  1. /cms/site23
    1. views
      1. fr
        1. board.phtml
      2. en
        1. board.phtml
  1. <div id="board">
  2. <a id="bug" href="<?php echo $base_path; ?>/fr/informations-systeme"></a>
  3. </div>
  1. <div id="board">
  2. <a id="bug" href="<?php echo $base_path; ?>/en/system-information"></a>
  3. </div>

Ces vues n'affichent rien. Les images sont placées par la feuille de style. Ajoutez le contenu suivant au fichier css/theme.css :

  1. #board {height:200px;margin-bottom:0.5em;background:transparent url(../images/bamboo.png) no-repeat center center;}
  2. #board #bug {float:right;width:64px;height:64px;position:relative;background:transparent url(../images/ladybug.png) no-repeat;cursor:default;}
  3. #board #bug {top:156px;right:210px;}
  4. #board #bug:hover {top:158px;right:213px;}

Ajoutez les images pour le fond du panneau et la coccinelle dans le dossier images :

  1. /cms/site23
    1. images
      1. bamboo.png
      2. ladybug.png

Modifiez la page d'accueil :

  1.     $board = view('board', $lang);

Fabrique le panneau.

  1.     $output = layout('home', compact('footer', 'banner', 'board', 'content'));

Fabrique la page d'accueil avec un modèle de document particulier.

Ajoutez le modèle de document home.phtml qui est spécifique à la page d'accueil dans le dossier layouts :

  1. /cms/site23
    1. layouts
      1. home.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. <?php echo $banner; ?>
  8. <?php echo $board; ?>
  9. <div id="content">
  10. <?php echo $content; ?>
  11. </div>
  12. <?php if (isset($footer)): ?>
  13. <?php echo $footer; ?>
  14. <?php endif; ?>
  15. </body>
  16. </html>

Place l'en-tête du document puis le bandeau, le panneau, le contenu et le pied de page du corps.

Entrez http://localhost/cms/site23/fr dans la barre d'adresse de votre navigateur. Déplacez le pointeur de la souris sur la coccinelle. Elle doit bouger. Cliquez. Le site affiche la page d'information sur le système. Vérifiez la version 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].