annotate includes/class.skeleton.php @ 53:ec0c926a78a6

Nettoyage de la classe d'accès aux données. Petit re-arrangement: les fonctions permettant de s'assurer que l'on a bien de l'utf-8 passe désormais dans la classe TextUtils. D'autre part, la classe a été notablement modifié: 1) si on souhaite passer un nom de base de données, il faut le faire dans le constructeur (précédement, c'était dans la méthode connect, mais c'était trompeur car le code ne gére absolument pas la connexion à deux bases de données différentes sur le même objet) 2) le code essayait de faire du ref-counting sur le nombre de fois où on avait appellé la fonction de connexion, pour fermer quand on avait atteint le même nombre de déconnexion, mais ne faisait pas ca particulièrement bien 3) il y avait une auto-connexion lors de l'execution des requetes si l'on était pas déja connecté, mais il n'y avait jamais d'auto-deconnexion (le code était buggé) 4) on essayait systématiquement de s'assurer que les enregistrements obtenus depuis la base de données étaient en utf8. A priori, c'est pour des considérations de migrations hérités de Mega-Poudlard, mais je crois que ce n'est pas necessaire pour ce blog, et ca ne l'est certainement pas dans le cas général...
author Franck Deroche <webmaster@defr.org>
date Tue, 29 Jan 2008 11:52:32 +0100
parents 1cdb1a68634b
children 77b3ed19aab9
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@36 6 private $lastUpdate = 0;
webmaster@11 7 private $showCalendar = false;
webmaster@11 8 private $calendarMonth;
webmaster@11 9 private $calendarYear;
webmaster@21 10 private $useXML;
webmaster@11 11
webmaster@32 12 const OUTPUT_XHTML = 'xhtml';
webmaster@32 13 const OUTPUT_ATOM = 'atom';
webmaster@32 14 const OUTPUT_RSS = 'rss';
webmaster@32 15
webmaster@32 16 private static $outputType = OUTPUT_XHTML;
webmaster@32 17 private static $templates = array();
webmaster@32 18
webmaster@11 19 public function __construct() {
webmaster@32 20 parent::__construct(Skeleton::getTemplateFile('skeleton'));
webmaster@26 21 parent::shouldStripAttributesInTemplateNS(true);
webmaster@11 22 $this->styleSheets = array();
webmaster@11 23 $this->addDefaultSheets();
webmaster@11 24 $this->blogPosts = array();
webmaster@21 25 $this->useXML = empty($_SERVER['HTTP_ACCEPT']) ||
webmaster@21 26 stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml');
webmaster@11 27 }
webmaster@11 28
webmaster@11 29 public function setTitle($titre) {
webmaster@11 30 $this->setParams(array('title' => $titre));
webmaster@11 31 }
webmaster@11 32
webmaster@11 33 private function buildSidebar() {
webmaster@11 34 $sidebar = new Template('sidebar.xml');
webmaster@11 35 // 1. Récupération des archives
webmaster@11 36 $db = Factory::getDB();
webmaster@11 37 $db->Query("
webmaster@11 38 SELECT
webmaster@11 39 MONTH(DatePost) As Month,
webmaster@11 40 YEAR(DatePost) As Year,
webmaster@11 41 COUNT(num_mess) As Nb
webmaster@11 42 FROM Mess
webmaster@11 43 GROUP BY
webmaster@11 44 MONTH(DatePost),
webmaster@11 45 YEAR(DatePost)
webmaster@11 46 ORDER BY
webmaster@11 47 YEAR(DatePost) DESC,
webmaster@11 48 Month(DatePost) DESC
webmaster@11 49 ");
webmaster@11 50 $archives = array();
webmaster@11 51 while($row = $db->GetRow()) {
webmaster@11 52 $curArchiveTpl = new Template('archive.xml');
webmaster@11 53 $monthName = TextUtils::getMonthName($row['Month']);
webmaster@11 54 $curArchiveTpl->setParams(array(
webmaster@11 55 'a' => $monthName . ' ' . $row['Year'],
webmaster@11 56 'a@href' => "http://defr.org/blog/posts/{$row['Year']}/{$row['Month']}",
webmaster@11 57 'postCount' => '(' . $row['Nb'] . ')'
webmaster@11 58 ));
webmaster@11 59 $archives[] = array('li' => $curArchiveTpl);
webmaster@11 60 }
webmaster@11 61 // 2. Récupération des derniers commentaires
webmaster@11 62 $db->Query("
webmaster@11 63 SELECT C.*, M.Titre
webmaster@11 64 FROM Commentaires C, Mess M
webmaster@11 65 WHERE C.MessId = M.num_mess AND C.Visible=1
webmaster@11 66 ORDER BY num_comm DESC LIMIT 20");
webmaster@11 67 $i = 0;
webmaster@11 68 $comments = array();
webmaster@11 69 while($row = $db->GetRow()) {
webmaster@11 70 $curCommentTpl = new Template('commentIndex.xml');
webmaster@11 71 // On récupère une version filtrée du titre du post ...
webmaster@11 72 $tf = TextUtils::StripTitle($row['Titre']);
webmaster@11 73 // ... Qui nous permet d'obtenir l'adresse du commentaire sur le post
webmaster@11 74 $c_url = "/blog/post/{$row['MessId']}-$tf#c{$row['num_comm']}";
webmaster@11 75 // Si jamais on a une adresse mail, on rajoute un mailto:
webmaster@11 76 if(strpos($row['Adresse'], '@') !== false)
webmaster@11 77 $row['Adresse'] = 'mailto:' . $row['Adresse'];
webmaster@11 78 // On commence par définir les paramètres généraux
webmaster@11 79 $params = array(
webmaster@11 80 '#CommentAuthor' => $row['Auteur'],
webmaster@11 81 '#CommentAuthor@href' => $row['Adresse'],
webmaster@11 82 '#Post' => $row['Titre'],
webmaster@11 83 '#Post@href' => $c_url
webmaster@11 84 );
webmaster@11 85 // On affiche les 5 commentaires les plus récents en version complète
webmaster@11 86 // puis les 15 autres en versions résumées
webmaster@11 87 if($i < 5) {
webmaster@11 88 $Comment = nl2br($row['Comment']);
webmaster@11 89 }
webmaster@11 90 else {
webmaster@11 91 $Comment = str_replace("\n", " ", strip_tags($row['Comment']));
webmaster@11 92 if(strlen($Comment > 100))
webmaster@11 93 $Comment = utf8_encode(substr(utf8_decode($Comment), 0, 97)) . "...";
webmaster@11 94 $params['li@class'] = 'fold';
webmaster@11 95 }
webmaster@11 96
webmaster@11 97 $frag = $curCommentTpl->getDocumentFragment();
webmaster@11 98 $frag->appendXML($Comment);
webmaster@11 99 $params['comment'] = $frag;
webmaster@11 100 $curCommentTpl->setParams($params);
webmaster@11 101 $comments[] = array('blogComment' => $curCommentTpl);
webmaster@11 102 $i++;
webmaster@11 103 }
webmaster@11 104 // 3. Application des paramètres
webmaster@11 105 $sidebar->setParams(array(
webmaster@11 106 '#archives' => $archives,
webmaster@11 107 '#BlogCommentIndex' => $comments
webmaster@11 108 ));
webmaster@11 109 return $sidebar;
webmaster@11 110 }
webmaster@11 111
webmaster@11 112 private function buildLinks() {
webmaster@11 113 $links = new Template('links.xml');
webmaster@11 114 return $links;
webmaster@11 115 }
webmaster@11 116
webmaster@11 117 private function buildCalendar() {
webmaster@11 118 $retVal = null;
webmaster@11 119 if($this->showCalendar) {
webmaster@11 120 $cMonth = $this->calendarMonth;
webmaster@11 121 $cYear = $this->calendarYear;
webmaster@11 122 $nextMonth = ($cMonth % 12) + 1;
webmaster@11 123 $nextYear = ($nextMonth == 1) ? $cYear + 1 : $cYear;
webmaster@14 124 $prevMonth = $cMonth - 1;
webmaster@14 125 if($prevMonth == 0)
webmaster@14 126 $prevMonth = 12;
webmaster@11 127 $prevYear = ($prevMonth == 12) ? $cYear - 1 : $cYear;
webmaster@11 128 $retVal = new Template('calendar.xml');
webmaster@11 129 $retVal->setParams(array(
webmaster@11 130 '#calPrev' => TextUtils::getMonthName($prevMonth) . ' ' . $prevYear,
webmaster@11 131 '#calPrev@href' => '/blog/posts/' . $prevYear . '/' . $prevMonth,
webmaster@11 132 '#calNext' => TextUtils::getMonthName($nextMonth) . ' ' . $nextYear,
webmaster@11 133 '#calNext@href' => '/blog/posts/' . $nextYear . '/' . $nextMonth,
webmaster@11 134 'currentMonth' => TextUtils::getMonthName($cMonth) . ' ' . $cYear
webmaster@11 135 ));
webmaster@11 136 } else {
webmaster@11 137 $retVal = '';
webmaster@11 138 }
webmaster@11 139 return $retVal;
webmaster@11 140 }
webmaster@11 141
webmaster@11 142 public function addStyleSheet($SheetName, $CSSFile, $enabled = false) {
webmaster@11 143 $this->styleSheets[] = (object)array(
webmaster@11 144 'name' => $SheetName,
webmaster@11 145 'CSSFile' => $CSSFile,
webmaster@11 146 'enabled' => $enabled
webmaster@11 147 );
webmaster@11 148 }
webmaster@11 149
webmaster@11 150 public function enableStyleSheet($styleSheetName) {
webmaster@11 151 foreach($this->styleSheets as $styleSheet) {
webmaster@11 152 $styleSheet->enabled = ($styleSheet->name == $styleSheetName);
webmaster@11 153 }
webmaster@11 154 }
webmaster@11 155
webmaster@11 156 public function addDefaultSheets() {
webmaster@11 157 $StyleSheets = array(
webmaster@11 158 "Somatic" => "Somatic.css",
webmaster@11 159 "OliveVerde" => "OliveVerde.css",
webmaster@11 160 "Lite:Reloaded" => "Lite_nv.css",
webmaster@11 161 "Brushed" => "Brushed.css",
webmaster@11 162 ":Hover" => "HoverExp.css");
webmaster@11 163 $CkStyle = (array_key_exists("style", $_COOKIE) &&
webmaster@11 164 array_key_exists($_COOKIE['style'], $StyleSheets))
webmaster@11 165 ? $_COOKIE['style']
webmaster@11 166 :"Somatic";
webmaster@11 167 foreach($StyleSheets as $SheetName => $CSSFile)
webmaster@11 168 $this->addStyleSheet($SheetName, $CSSFile, ($SheetName == $CkStyle));
webmaster@11 169 }
webmaster@11 170
webmaster@11 171 public function addBlogPost(Template $blogPost) {
webmaster@11 172 $this->blogPosts[] = $blogPost;
webmaster@11 173 }
webmaster@11 174
webmaster@36 175 public function checkUpdateTime($time) {
webmaster@36 176 if($time > $this->lastUpdate)
webmaster@36 177 $this->lastUpdate = $time;
webmaster@36 178 }
webmaster@36 179
webmaster@11 180 public function showCalendar($newValue = false) {
webmaster@11 181 $this->showCalendar = $newValue;
webmaster@11 182 }
webmaster@11 183
webmaster@11 184 public function setCalendarMonth($month, $year) {
webmaster@11 185 $this->calendarMonth = $month;
webmaster@11 186 $this->calendarYear = $year;
webmaster@11 187 }
webmaster@11 188
webmaster@11 189 private function prepareOutput() {
webmaster@11 190 $params = array();
webmaster@11 191
webmaster@11 192 // Ajout de la sidebar
webmaster@11 193 $params['sidebar'] = $this->buildSideBar();
webmaster@11 194
webmaster@11 195 // Ajout de la liste des liens
webmaster@11 196 $params['links'] = $this->buildLinks();
webmaster@11 197
webmaster@11 198 // Ajout des feuilles de style
webmaster@11 199 $params['possibleStyleSheets'] = array();
webmaster@11 200 foreach($this->styleSheets as $styleSheet) {
webmaster@11 201 $type = ($styleSheet->enabled) ? "" : "Alternate ";
webmaster@11 202 $type .= "StyleSheet";
webmaster@11 203 $params['possibleStyleSheets'][] = array(
webmaster@11 204 'link@href' => '/blog/css/' . $styleSheet->CSSFile,
webmaster@11 205 'link@rel' => $type,
webmaster@11 206 'link@title' => $styleSheet->name
webmaster@11 207 );
webmaster@11 208 }
webmaster@11 209
webmaster@11 210 // Affichage éventuel des liens vers les mois précédents et suivants
webmaster@11 211 $params['calendarPrevNext'] = $this->buildCalendar();
webmaster@11 212
webmaster@11 213 // Ajout des posts de blog
webmaster@11 214 $params['#Posts'] = array();
webmaster@11 215 foreach($this->blogPosts as $blogPost) {
webmaster@11 216 $params['#Posts'][] = array('post' => $blogPost);
webmaster@11 217 }
webmaster@11 218
webmaster@36 219 // Date de dernière modification
webmaster@36 220 $params['modifiedDate'] = date('c', $this->lastUpdate);
webmaster@36 221
webmaster@11 222 // Application des l'ensemble de ces paramètres
webmaster@11 223 $this->setParams($params);
webmaster@11 224 }
webmaster@11 225
webmaster@11 226 public function __toString() {
webmaster@11 227 $this->prepareOutput();
webmaster@21 228 $returnValue = parent::__toString();
webmaster@35 229 $this->setContentTypeHeader();
webmaster@35 230 // L'ajout d'un preambule XML fait sortir IE de son mode de
webmaster@35 231 // respect des standards
webmaster@35 232 if(!$this->useXML)
webmaster@21 233 $returnValue = ereg_replace('<\?xml[^\?]*\?>', '', $returnValue);
webmaster@21 234 return $returnValue;
webmaster@11 235 }
webmaster@32 236
webmaster@35 237 private function setContentTypeHeader() {
webmaster@35 238 $contentType = null;
webmaster@35 239 if(Skeleton::getOutputType() == Skeleton::OUTPUT_ATOM)
webmaster@35 240 $contentType = 'application/atom+xml';
webmaster@38 241 else if($this->useXML && Skeleton::getOutputType() == Skeleton::OUTPUT_XHTML)
webmaster@35 242 $contentType = 'application/xhtml+xml; charset=utf-8';
webmaster@35 243 if(!is_null($contentType))
webmaster@35 244 header('Content-Type: ' . $contentType);
webmaster@35 245 }
webmaster@35 246
webmaster@32 247 public static function getTemplateFile($type) {
webmaster@32 248 if(count(Skeleton::$templates) == 0) {
webmaster@32 249 // Construction du tableau des différents templates
webmaster@32 250 // permettant de répondre au "type" de sortie demandé
webmaster@32 251 $iniFile = parse_ini_file('templates.conf', true);
webmaster@32 252
webmaster@43 253 // Récupération de la requete
webmaster@43 254 $requete = Factory::getRequete();
webmaster@43 255
webmaster@43 256 // On essaie de trouver le format en Query-String
webmaster@43 257 // On recherche tout d'abord un paramètre correspondant
webmaster@43 258 // au nom d'un des formats. On prend le premier mentionné,
webmaster@43 259 // par ordre d'apparition dans le fichier templates.conf
webmaster@43 260 $format = null;
webmaster@43 261 while(is_null($format) && list($key, ) = each($iniFile)) {
webmaster@43 262 $format = $requete->get($key, null, null);
webmaster@43 263 }
webmaster@43 264
webmaster@43 265 // Si on a trouvé un format, on l'applique.
webmaster@43 266 // Sinon, on prend le template nommé 'xhtml'
webmaster@43 267 if(!is_null($format)) {
webmaster@32 268 Skeleton::$templates = $iniFile[$format];
webmaster@32 269 Skeleton::$outputType = $format;
webmaster@32 270 } else {
webmaster@32 271 Skeleton::$templates = $iniFile[Skeleton::OUTPUT_XHTML];
webmaster@32 272 Skeleton::$outputType = Skeleton::OUTPUT_XHTML;
webmaster@32 273 }
webmaster@32 274 }
webmaster@32 275 return Skeleton::$templates[$type];
webmaster@32 276 }
webmaster@32 277
webmaster@32 278 public static function getOutputType() {
webmaster@32 279 // On s'assure que la demande a été analysée, si ce n'est pas
webmaster@32 280 // le cas on le fait maintenant, en demandant un template
webmaster@32 281 if(count(Skeleton::$templates) == 0)
webmaster@32 282 Skeleton::getTemplateFile('skeleton');
webmaster@32 283 return Skeleton::$outputType;
webmaster@32 284 }
webmaster@11 285 }
webmaster@11 286 ?>