annotate includes/class.skeleton.php @ 35:e776701841ba

Gestion plus flexible des content-type Cela permet notamment de gérer correctement le cas de Atom. Ca ne devrait toutefois probablement pas rester comme ça longtemps, il est plus que probable que le content-type passe lui aussi en paramètre de configuration dans les templates.
author Franck Deroche <webmaster@defr.org>
date Mon, 05 Nov 2007 09:56:44 +0100
parents 4cea8b128fdd
children a6c3716cab6a
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@35 220 $this->setContentTypeHeader();
webmaster@35 221 // L'ajout d'un preambule XML fait sortir IE de son mode de
webmaster@35 222 // respect des standards
webmaster@35 223 if(!$this->useXML)
webmaster@21 224 $returnValue = ereg_replace('<\?xml[^\?]*\?>', '', $returnValue);
webmaster@21 225 return $returnValue;
webmaster@11 226 }
webmaster@32 227
webmaster@35 228 private function setContentTypeHeader() {
webmaster@35 229 $contentType = null;
webmaster@35 230 if(Skeleton::getOutputType() == Skeleton::OUTPUT_ATOM)
webmaster@35 231 $contentType = 'application/atom+xml';
webmaster@35 232 else if($this->useXML && Skeleton::getOutputType == Skeleton::OUTPUT_XHTML)
webmaster@35 233 $contentType = 'application/xhtml+xml; charset=utf-8';
webmaster@35 234 if(!is_null($contentType))
webmaster@35 235 header('Content-Type: ' . $contentType);
webmaster@35 236 }
webmaster@35 237
webmaster@32 238 public static function getTemplateFile($type) {
webmaster@32 239 if(count(Skeleton::$templates) == 0) {
webmaster@32 240 // Construction du tableau des différents templates
webmaster@32 241 // permettant de répondre au "type" de sortie demandé
webmaster@32 242 $iniFile = parse_ini_file('templates.conf', true);
webmaster@32 243
webmaster@32 244 $format = Factory::getRequete()
webmaster@32 245 ->get('outputType', null, Skeleton::OUTPUT_XHTML);
webmaster@32 246
webmaster@32 247 if(array_key_exists($format, $iniFile)) {
webmaster@32 248 Skeleton::$templates = $iniFile[$format];
webmaster@32 249 Skeleton::$outputType = $format;
webmaster@32 250 } else {
webmaster@32 251 Skeleton::$templates = $iniFile[Skeleton::OUTPUT_XHTML];
webmaster@32 252 Skeleton::$outputType = Skeleton::OUTPUT_XHTML;
webmaster@32 253 }
webmaster@32 254 }
webmaster@32 255 return Skeleton::$templates[$type];
webmaster@32 256 }
webmaster@32 257
webmaster@32 258 public static function getOutputType() {
webmaster@32 259 // On s'assure que la demande a été analysée, si ce n'est pas
webmaster@32 260 // le cas on le fait maintenant, en demandant un template
webmaster@32 261 if(count(Skeleton::$templates) == 0)
webmaster@32 262 Skeleton::getTemplateFile('skeleton');
webmaster@32 263 return Skeleton::$outputType;
webmaster@32 264 }
webmaster@11 265 }
webmaster@11 266 ?>