annotate includes/class.skeleton.php @ 21:86a6793f1408

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