annotate includes/class.skeleton.php @ 26:710fe2fd2ff7

Suppression des attributs dans Template::NS, rendant le blog conforme XHTML
author Franck Deroche <webmaster@defr.org>
date Thu, 01 Nov 2007 06:07:01 -0700
parents 86a6793f1408
children 4cea8b128fdd
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@11 11 public function __construct() {
webmaster@11 12 parent::__construct('main.xml');
webmaster@26 13 parent::shouldStripAttributesInTemplateNS(true);
webmaster@11 14 $this->styleSheets = array();
webmaster@11 15 $this->addDefaultSheets();
webmaster@11 16 $this->blogPosts = array();
webmaster@21 17 $this->useXML = empty($_SERVER['HTTP_ACCEPT']) ||
webmaster@21 18 stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml');
webmaster@11 19 }
webmaster@11 20
webmaster@11 21 public function setTitle($titre) {
webmaster@11 22 $this->setParams(array('title' => $titre));
webmaster@11 23 }
webmaster@11 24
webmaster@11 25 private function buildSidebar() {
webmaster@11 26 $sidebar = new Template('sidebar.xml');
webmaster@11 27 // 1. Récupération des archives
webmaster@11 28 $db = Factory::getDB();
webmaster@11 29 $db->Query("
webmaster@11 30 SELECT
webmaster@11 31 MONTH(DatePost) As Month,
webmaster@11 32 YEAR(DatePost) As Year,
webmaster@11 33 COUNT(num_mess) As Nb
webmaster@11 34 FROM Mess
webmaster@11 35 GROUP BY
webmaster@11 36 MONTH(DatePost),
webmaster@11 37 YEAR(DatePost)
webmaster@11 38 ORDER BY
webmaster@11 39 YEAR(DatePost) DESC,
webmaster@11 40 Month(DatePost) DESC
webmaster@11 41 ");
webmaster@11 42 $archives = array();
webmaster@11 43 while($row = $db->GetRow()) {
webmaster@11 44 $curArchiveTpl = new Template('archive.xml');
webmaster@11 45 $monthName = TextUtils::getMonthName($row['Month']);
webmaster@11 46 $curArchiveTpl->setParams(array(
webmaster@11 47 'a' => $monthName . ' ' . $row['Year'],
webmaster@11 48 'a@href' => "http://defr.org/blog/posts/{$row['Year']}/{$row['Month']}",
webmaster@11 49 'postCount' => '(' . $row['Nb'] . ')'
webmaster@11 50 ));
webmaster@11 51 $archives[] = array('li' => $curArchiveTpl);
webmaster@11 52 }
webmaster@11 53 // 2. Récupération des derniers commentaires
webmaster@11 54 $db->Query("
webmaster@11 55 SELECT C.*, M.Titre
webmaster@11 56 FROM Commentaires C, Mess M
webmaster@11 57 WHERE C.MessId = M.num_mess AND C.Visible=1
webmaster@11 58 ORDER BY num_comm DESC LIMIT 20");
webmaster@11 59 $i = 0;
webmaster@11 60 $comments = array();
webmaster@11 61 while($row = $db->GetRow()) {
webmaster@11 62 $curCommentTpl = new Template('commentIndex.xml');
webmaster@11 63 // On récupère une version filtrée du titre du post ...
webmaster@11 64 $tf = TextUtils::StripTitle($row['Titre']);
webmaster@11 65 // ... Qui nous permet d'obtenir l'adresse du commentaire sur le post
webmaster@11 66 $c_url = "/blog/post/{$row['MessId']}-$tf#c{$row['num_comm']}";
webmaster@11 67 // Si jamais on a une adresse mail, on rajoute un mailto:
webmaster@11 68 if(strpos($row['Adresse'], '@') !== false)
webmaster@11 69 $row['Adresse'] = 'mailto:' . $row['Adresse'];
webmaster@11 70 // On commence par définir les paramètres généraux
webmaster@11 71 $params = array(
webmaster@11 72 '#CommentAuthor' => $row['Auteur'],
webmaster@11 73 '#CommentAuthor@href' => $row['Adresse'],
webmaster@11 74 '#Post' => $row['Titre'],
webmaster@11 75 '#Post@href' => $c_url
webmaster@11 76 );
webmaster@11 77 // On affiche les 5 commentaires les plus récents en version complète
webmaster@11 78 // puis les 15 autres en versions résumées
webmaster@11 79 if($i < 5) {
webmaster@11 80 $Comment = nl2br($row['Comment']);
webmaster@11 81 }
webmaster@11 82 else {
webmaster@11 83 $Comment = str_replace("\n", " ", strip_tags($row['Comment']));
webmaster@11 84 if(strlen($Comment > 100))
webmaster@11 85 $Comment = utf8_encode(substr(utf8_decode($Comment), 0, 97)) . "...";
webmaster@11 86 $params['li@class'] = 'fold';
webmaster@11 87 }
webmaster@11 88
webmaster@11 89 $frag = $curCommentTpl->getDocumentFragment();
webmaster@11 90 $frag->appendXML($Comment);
webmaster@11 91 $params['comment'] = $frag;
webmaster@11 92 $curCommentTpl->setParams($params);
webmaster@11 93 $comments[] = array('blogComment' => $curCommentTpl);
webmaster@11 94 $i++;
webmaster@11 95 }
webmaster@11 96 // 3. Application des paramètres
webmaster@11 97 $sidebar->setParams(array(
webmaster@11 98 '#archives' => $archives,
webmaster@11 99 '#BlogCommentIndex' => $comments
webmaster@11 100 ));
webmaster@11 101 return $sidebar;
webmaster@11 102 }
webmaster@11 103
webmaster@11 104 private function buildLinks() {
webmaster@11 105 $links = new Template('links.xml');
webmaster@11 106 return $links;
webmaster@11 107 }
webmaster@11 108
webmaster@11 109 private function buildCalendar() {
webmaster@11 110 $retVal = null;
webmaster@11 111 if($this->showCalendar) {
webmaster@11 112 $cMonth = $this->calendarMonth;
webmaster@11 113 $cYear = $this->calendarYear;
webmaster@11 114 $nextMonth = ($cMonth % 12) + 1;
webmaster@11 115 $nextYear = ($nextMonth == 1) ? $cYear + 1 : $cYear;
webmaster@14 116 $prevMonth = $cMonth - 1;
webmaster@14 117 if($prevMonth == 0)
webmaster@14 118 $prevMonth = 12;
webmaster@11 119 $prevYear = ($prevMonth == 12) ? $cYear - 1 : $cYear;
webmaster@11 120 $retVal = new Template('calendar.xml');
webmaster@11 121 $retVal->setParams(array(
webmaster@11 122 '#calPrev' => TextUtils::getMonthName($prevMonth) . ' ' . $prevYear,
webmaster@11 123 '#calPrev@href' => '/blog/posts/' . $prevYear . '/' . $prevMonth,
webmaster@11 124 '#calNext' => TextUtils::getMonthName($nextMonth) . ' ' . $nextYear,
webmaster@11 125 '#calNext@href' => '/blog/posts/' . $nextYear . '/' . $nextMonth,
webmaster@11 126 'currentMonth' => TextUtils::getMonthName($cMonth) . ' ' . $cYear
webmaster@11 127 ));
webmaster@11 128 } else {
webmaster@11 129 $retVal = '';
webmaster@11 130 }
webmaster@11 131 return $retVal;
webmaster@11 132 }
webmaster@11 133
webmaster@11 134 public function addStyleSheet($SheetName, $CSSFile, $enabled = false) {
webmaster@11 135 $this->styleSheets[] = (object)array(
webmaster@11 136 'name' => $SheetName,
webmaster@11 137 'CSSFile' => $CSSFile,
webmaster@11 138 'enabled' => $enabled
webmaster@11 139 );
webmaster@11 140 }
webmaster@11 141
webmaster@11 142 public function enableStyleSheet($styleSheetName) {
webmaster@11 143 foreach($this->styleSheets as $styleSheet) {
webmaster@11 144 $styleSheet->enabled = ($styleSheet->name == $styleSheetName);
webmaster@11 145 }
webmaster@11 146 }
webmaster@11 147
webmaster@11 148 public function addDefaultSheets() {
webmaster@11 149 $StyleSheets = array(
webmaster@11 150 "Somatic" => "Somatic.css",
webmaster@11 151 "OliveVerde" => "OliveVerde.css",
webmaster@11 152 "Lite:Reloaded" => "Lite_nv.css",
webmaster@11 153 "Brushed" => "Brushed.css",
webmaster@11 154 ":Hover" => "HoverExp.css");
webmaster@11 155 $CkStyle = (array_key_exists("style", $_COOKIE) &&
webmaster@11 156 array_key_exists($_COOKIE['style'], $StyleSheets))
webmaster@11 157 ? $_COOKIE['style']
webmaster@11 158 :"Somatic";
webmaster@11 159 foreach($StyleSheets as $SheetName => $CSSFile)
webmaster@11 160 $this->addStyleSheet($SheetName, $CSSFile, ($SheetName == $CkStyle));
webmaster@11 161 }
webmaster@11 162
webmaster@11 163 public function addBlogPost(Template $blogPost) {
webmaster@11 164 $this->blogPosts[] = $blogPost;
webmaster@11 165 }
webmaster@11 166
webmaster@11 167 public function showCalendar($newValue = false) {
webmaster@11 168 $this->showCalendar = $newValue;
webmaster@11 169 }
webmaster@11 170
webmaster@11 171 public function setCalendarMonth($month, $year) {
webmaster@11 172 $this->calendarMonth = $month;
webmaster@11 173 $this->calendarYear = $year;
webmaster@11 174 }
webmaster@11 175
webmaster@11 176 private function prepareOutput() {
webmaster@11 177 $params = array();
webmaster@11 178
webmaster@11 179 // Ajout de la sidebar
webmaster@11 180 $params['sidebar'] = $this->buildSideBar();
webmaster@11 181
webmaster@11 182 // Ajout de la liste des liens
webmaster@11 183 $params['links'] = $this->buildLinks();
webmaster@11 184
webmaster@11 185 // Ajout des feuilles de style
webmaster@11 186 $params['possibleStyleSheets'] = array();
webmaster@11 187 foreach($this->styleSheets as $styleSheet) {
webmaster@11 188 $type = ($styleSheet->enabled) ? "" : "Alternate ";
webmaster@11 189 $type .= "StyleSheet";
webmaster@11 190 $params['possibleStyleSheets'][] = array(
webmaster@11 191 'link@href' => '/blog/css/' . $styleSheet->CSSFile,
webmaster@11 192 'link@rel' => $type,
webmaster@11 193 'link@title' => $styleSheet->name
webmaster@11 194 );
webmaster@11 195 }
webmaster@11 196
webmaster@11 197 // Affichage éventuel des liens vers les mois précédents et suivants
webmaster@11 198 $params['calendarPrevNext'] = $this->buildCalendar();
webmaster@11 199
webmaster@11 200 // Ajout des posts de blog
webmaster@11 201 $params['#Posts'] = array();
webmaster@11 202 foreach($this->blogPosts as $blogPost) {
webmaster@11 203 $params['#Posts'][] = array('post' => $blogPost);
webmaster@11 204 }
webmaster@11 205
webmaster@11 206 // Application des l'ensemble de ces paramètres
webmaster@11 207 $this->setParams($params);
webmaster@11 208 }
webmaster@11 209
webmaster@11 210 public function __toString() {
webmaster@11 211 $this->prepareOutput();
webmaster@21 212 $returnValue = parent::__toString();
webmaster@21 213 if($this->useXML)
webmaster@21 214 header('Content-Type: application/xhtml+xml; charset=utf-8');
webmaster@21 215 else
webmaster@21 216 $returnValue = ereg_replace('<\?xml[^\?]*\?>', '', $returnValue);
webmaster@21 217 return $returnValue;
webmaster@11 218 }
webmaster@11 219 }
webmaster@11 220 ?>