annotate includes/class.skeleton.php @ 29:750613da68ec

Ajout d'un fallback en cas d'absence de TreeWalker. Ca devrait permettre de faire fonctionner l'administration dans la plupart des navigateurs (modulo la vérification de validité XML éventuellement).
author Franck Deroche <webmaster@defr.org>
date Thu, 01 Nov 2007 17:44:43 +0100
parents 710fe2fd2ff7
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 ?>