annotate includes/class.skeleton.php @ 32:4cea8b128fdd

Possibilité de choisir des templates différents en fonction du type de sortie. Le fichier templates.conf permet d'associer à chaque type de sortie (correspondant à une section du fichier INI) des templates pour le squelette, les posts et les commentaires. Il est possible de définir virtuellement une infinité de type de sorties différents, pour le moment seul de quoi obtenir un flux Atom a été ajouté. Pour changer le type de sortie, il faut passer en GET au script appellant un paramètre outputType. Si le paramètre reçu ne correspondant à aucun des types de sorties définis dans templates.conf, alors on prend du xhtml par défaut.
author Franck Deroche <webmaster@defr.org>
date Mon, 05 Nov 2007 09:06:46 +0100
parents 710fe2fd2ff7
children e776701841ba
rev   line source
webmaster@11 1 <?php
webmaster@11 2 class Skeleton extends Template {
webmaster@11 3
webmaster@11 4 private $styleSheets;
webmaster@11 5 private $blogPosts;
webmaster@11 6 private $showCalendar = false;
webmaster@11 7 private $calendarMonth;
webmaster@11 8 private $calendarYear;
webmaster@21 9 private $useXML;
webmaster@11 10
webmaster@32 11 const OUTPUT_XHTML = 'xhtml';
webmaster@32 12 const OUTPUT_ATOM = 'atom';
webmaster@32 13 const OUTPUT_RSS = 'rss';
webmaster@32 14
webmaster@32 15 private static $outputType = OUTPUT_XHTML;
webmaster@32 16 private static $templates = array();
webmaster@32 17
webmaster@11 18 public function __construct() {
webmaster@32 19 parent::__construct(Skeleton::getTemplateFile('skeleton'));
webmaster@26 20 parent::shouldStripAttributesInTemplateNS(true);
webmaster@11 21 $this->styleSheets = array();
webmaster@11 22 $this->addDefaultSheets();
webmaster@11 23 $this->blogPosts = array();
webmaster@21 24 $this->useXML = empty($_SERVER['HTTP_ACCEPT']) ||
webmaster@21 25 stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml');
webmaster@11 26 }
webmaster@11 27
webmaster@11 28 public function setTitle($titre) {
webmaster@11 29 $this->setParams(array('title' => $titre));
webmaster@11 30 }
webmaster@11 31
webmaster@11 32 private function buildSidebar() {
webmaster@11 33 $sidebar = new Template('sidebar.xml');
webmaster@11 34 // 1. Récupération des archives
webmaster@11 35 $db = Factory::getDB();
webmaster@11 36 $db->Query("
webmaster@11 37 SELECT
webmaster@11 38 MONTH(DatePost) As Month,
webmaster@11 39 YEAR(DatePost) As Year,
webmaster@11 40 COUNT(num_mess) As Nb
webmaster@11 41 FROM Mess
webmaster@11 42 GROUP BY
webmaster@11 43 MONTH(DatePost),
webmaster@11 44 YEAR(DatePost)
webmaster@11 45 ORDER BY
webmaster@11 46 YEAR(DatePost) DESC,
webmaster@11 47 Month(DatePost) DESC
webmaster@11 48 ");
webmaster@11 49 $archives = array();
webmaster@11 50 while($row = $db->GetRow()) {
webmaster@11 51 $curArchiveTpl = new Template('archive.xml');
webmaster@11 52 $monthName = TextUtils::getMonthName($row['Month']);
webmaster@11 53 $curArchiveTpl->setParams(array(
webmaster@11 54 'a' => $monthName . ' ' . $row['Year'],
webmaster@11 55 'a@href' => "http://defr.org/blog/posts/{$row['Year']}/{$row['Month']}",
webmaster@11 56 'postCount' => '(' . $row['Nb'] . ')'
webmaster@11 57 ));
webmaster@11 58 $archives[] = array('li' => $curArchiveTpl);
webmaster@11 59 }
webmaster@11 60 // 2. Récupération des derniers commentaires
webmaster@11 61 $db->Query("
webmaster@11 62 SELECT C.*, M.Titre
webmaster@11 63 FROM Commentaires C, Mess M
webmaster@11 64 WHERE C.MessId = M.num_mess AND C.Visible=1
webmaster@11 65 ORDER BY num_comm DESC LIMIT 20");
webmaster@11 66 $i = 0;
webmaster@11 67 $comments = array();
webmaster@11 68 while($row = $db->GetRow()) {
webmaster@11 69 $curCommentTpl = new Template('commentIndex.xml');
webmaster@11 70 // On récupère une version filtrée du titre du post ...
webmaster@11 71 $tf = TextUtils::StripTitle($row['Titre']);
webmaster@11 72 // ... Qui nous permet d'obtenir l'adresse du commentaire sur le post
webmaster@11 73 $c_url = "/blog/post/{$row['MessId']}-$tf#c{$row['num_comm']}";
webmaster@11 74 // Si jamais on a une adresse mail, on rajoute un mailto:
webmaster@11 75 if(strpos($row['Adresse'], '@') !== false)
webmaster@11 76 $row['Adresse'] = 'mailto:' . $row['Adresse'];
webmaster@11 77 // On commence par définir les paramètres généraux
webmaster@11 78 $params = array(
webmaster@11 79 '#CommentAuthor' => $row['Auteur'],
webmaster@11 80 '#CommentAuthor@href' => $row['Adresse'],
webmaster@11 81 '#Post' => $row['Titre'],
webmaster@11 82 '#Post@href' => $c_url
webmaster@11 83 );
webmaster@11 84 // On affiche les 5 commentaires les plus récents en version complète
webmaster@11 85 // puis les 15 autres en versions résumées
webmaster@11 86 if($i < 5) {
webmaster@11 87 $Comment = nl2br($row['Comment']);
webmaster@11 88 }
webmaster@11 89 else {
webmaster@11 90 $Comment = str_replace("\n", " ", strip_tags($row['Comment']));
webmaster@11 91 if(strlen($Comment > 100))
webmaster@11 92 $Comment = utf8_encode(substr(utf8_decode($Comment), 0, 97)) . "...";
webmaster@11 93 $params['li@class'] = 'fold';
webmaster@11 94 }
webmaster@11 95
webmaster@11 96 $frag = $curCommentTpl->getDocumentFragment();
webmaster@11 97 $frag->appendXML($Comment);
webmaster@11 98 $params['comment'] = $frag;
webmaster@11 99 $curCommentTpl->setParams($params);
webmaster@11 100 $comments[] = array('blogComment' => $curCommentTpl);
webmaster@11 101 $i++;
webmaster@11 102 }
webmaster@11 103 // 3. Application des paramètres
webmaster@11 104 $sidebar->setParams(array(
webmaster@11 105 '#archives' => $archives,
webmaster@11 106 '#BlogCommentIndex' => $comments
webmaster@11 107 ));
webmaster@11 108 return $sidebar;
webmaster@11 109 }
webmaster@11 110
webmaster@11 111 private function buildLinks() {
webmaster@11 112 $links = new Template('links.xml');
webmaster@11 113 return $links;
webmaster@11 114 }
webmaster@11 115
webmaster@11 116 private function buildCalendar() {
webmaster@11 117 $retVal = null;
webmaster@11 118 if($this->showCalendar) {
webmaster@11 119 $cMonth = $this->calendarMonth;
webmaster@11 120 $cYear = $this->calendarYear;
webmaster@11 121 $nextMonth = ($cMonth % 12) + 1;
webmaster@11 122 $nextYear = ($nextMonth == 1) ? $cYear + 1 : $cYear;
webmaster@14 123 $prevMonth = $cMonth - 1;
webmaster@14 124 if($prevMonth == 0)
webmaster@14 125 $prevMonth = 12;
webmaster@11 126 $prevYear = ($prevMonth == 12) ? $cYear - 1 : $cYear;
webmaster@11 127 $retVal = new Template('calendar.xml');
webmaster@11 128 $retVal->setParams(array(
webmaster@11 129 '#calPrev' => TextUtils::getMonthName($prevMonth) . ' ' . $prevYear,
webmaster@11 130 '#calPrev@href' => '/blog/posts/' . $prevYear . '/' . $prevMonth,
webmaster@11 131 '#calNext' => TextUtils::getMonthName($nextMonth) . ' ' . $nextYear,
webmaster@11 132 '#calNext@href' => '/blog/posts/' . $nextYear . '/' . $nextMonth,
webmaster@11 133 'currentMonth' => TextUtils::getMonthName($cMonth) . ' ' . $cYear
webmaster@11 134 ));
webmaster@11 135 } else {
webmaster@11 136 $retVal = '';
webmaster@11 137 }
webmaster@11 138 return $retVal;
webmaster@11 139 }
webmaster@11 140
webmaster@11 141 public function addStyleSheet($SheetName, $CSSFile, $enabled = false) {
webmaster@11 142 $this->styleSheets[] = (object)array(
webmaster@11 143 'name' => $SheetName,
webmaster@11 144 'CSSFile' => $CSSFile,
webmaster@11 145 'enabled' => $enabled
webmaster@11 146 );
webmaster@11 147 }
webmaster@11 148
webmaster@11 149 public function enableStyleSheet($styleSheetName) {
webmaster@11 150 foreach($this->styleSheets as $styleSheet) {
webmaster@11 151 $styleSheet->enabled = ($styleSheet->name == $styleSheetName);
webmaster@11 152 }
webmaster@11 153 }
webmaster@11 154
webmaster@11 155 public function addDefaultSheets() {
webmaster@11 156 $StyleSheets = array(
webmaster@11 157 "Somatic" => "Somatic.css",
webmaster@11 158 "OliveVerde" => "OliveVerde.css",
webmaster@11 159 "Lite:Reloaded" => "Lite_nv.css",
webmaster@11 160 "Brushed" => "Brushed.css",
webmaster@11 161 ":Hover" => "HoverExp.css");
webmaster@11 162 $CkStyle = (array_key_exists("style", $_COOKIE) &&
webmaster@11 163 array_key_exists($_COOKIE['style'], $StyleSheets))
webmaster@11 164 ? $_COOKIE['style']
webmaster@11 165 :"Somatic";
webmaster@11 166 foreach($StyleSheets as $SheetName => $CSSFile)
webmaster@11 167 $this->addStyleSheet($SheetName, $CSSFile, ($SheetName == $CkStyle));
webmaster@11 168 }
webmaster@11 169
webmaster@11 170 public function addBlogPost(Template $blogPost) {
webmaster@11 171 $this->blogPosts[] = $blogPost;
webmaster@11 172 }
webmaster@11 173
webmaster@11 174 public function showCalendar($newValue = false) {
webmaster@11 175 $this->showCalendar = $newValue;
webmaster@11 176 }
webmaster@11 177
webmaster@11 178 public function setCalendarMonth($month, $year) {
webmaster@11 179 $this->calendarMonth = $month;
webmaster@11 180 $this->calendarYear = $year;
webmaster@11 181 }
webmaster@11 182
webmaster@11 183 private function prepareOutput() {
webmaster@11 184 $params = array();
webmaster@11 185
webmaster@11 186 // Ajout de la sidebar
webmaster@11 187 $params['sidebar'] = $this->buildSideBar();
webmaster@11 188
webmaster@11 189 // Ajout de la liste des liens
webmaster@11 190 $params['links'] = $this->buildLinks();
webmaster@11 191
webmaster@11 192 // Ajout des feuilles de style
webmaster@11 193 $params['possibleStyleSheets'] = array();
webmaster@11 194 foreach($this->styleSheets as $styleSheet) {
webmaster@11 195 $type = ($styleSheet->enabled) ? "" : "Alternate ";
webmaster@11 196 $type .= "StyleSheet";
webmaster@11 197 $params['possibleStyleSheets'][] = array(
webmaster@11 198 'link@href' => '/blog/css/' . $styleSheet->CSSFile,
webmaster@11 199 'link@rel' => $type,
webmaster@11 200 'link@title' => $styleSheet->name
webmaster@11 201 );
webmaster@11 202 }
webmaster@11 203
webmaster@11 204 // Affichage éventuel des liens vers les mois précédents et suivants
webmaster@11 205 $params['calendarPrevNext'] = $this->buildCalendar();
webmaster@11 206
webmaster@11 207 // Ajout des posts de blog
webmaster@11 208 $params['#Posts'] = array();
webmaster@11 209 foreach($this->blogPosts as $blogPost) {
webmaster@11 210 $params['#Posts'][] = array('post' => $blogPost);
webmaster@11 211 }
webmaster@11 212
webmaster@11 213 // Application des l'ensemble de ces paramètres
webmaster@11 214 $this->setParams($params);
webmaster@11 215 }
webmaster@11 216
webmaster@11 217 public function __toString() {
webmaster@11 218 $this->prepareOutput();
webmaster@21 219 $returnValue = parent::__toString();
webmaster@21 220 if($this->useXML)
webmaster@21 221 header('Content-Type: application/xhtml+xml; charset=utf-8');
webmaster@21 222 else
webmaster@21 223 $returnValue = ereg_replace('<\?xml[^\?]*\?>', '', $returnValue);
webmaster@21 224 return $returnValue;
webmaster@11 225 }
webmaster@32 226
webmaster@32 227 public static function getTemplateFile($type) {
webmaster@32 228 if(count(Skeleton::$templates) == 0) {
webmaster@32 229 // Construction du tableau des différents templates
webmaster@32 230 // permettant de répondre au "type" de sortie demandé
webmaster@32 231 $iniFile = parse_ini_file('templates.conf', true);
webmaster@32 232
webmaster@32 233 $format = Factory::getRequete()
webmaster@32 234 ->get('outputType', null, Skeleton::OUTPUT_XHTML);
webmaster@32 235
webmaster@32 236 if(array_key_exists($format, $iniFile)) {
webmaster@32 237 Skeleton::$templates = $iniFile[$format];
webmaster@32 238 Skeleton::$outputType = $format;
webmaster@32 239 } else {
webmaster@32 240 Skeleton::$templates = $iniFile[Skeleton::OUTPUT_XHTML];
webmaster@32 241 Skeleton::$outputType = Skeleton::OUTPUT_XHTML;
webmaster@32 242 }
webmaster@32 243 }
webmaster@32 244 return Skeleton::$templates[$type];
webmaster@32 245 }
webmaster@32 246
webmaster@32 247 public static function getOutputType() {
webmaster@32 248 // On s'assure que la demande a été analysée, si ce n'est pas
webmaster@32 249 // le cas on le fait maintenant, en demandant un template
webmaster@32 250 if(count(Skeleton::$templates) == 0)
webmaster@32 251 Skeleton::getTemplateFile('skeleton');
webmaster@32 252 return Skeleton::$outputType;
webmaster@32 253 }
webmaster@11 254 }
webmaster@11 255 ?>