annotate includes/class.skeleton.php @ 70:e08186e4ed77

Ajout d'un installeur. Il est désormais possible d'utiliser ce script pour créer une installation vierge de Dual Blog, rendant presque facile la création de sa propre instance du blog :-) Une chose à noter cependant: il est encore /impératif/ de modifier le fichier pointant vers le fichier .htpass dans le .htaccess à la main pour le moment.
author Franck Deroche <webmaster@defr.org>
date Wed, 19 Mar 2008 12:08:15 +0100
parents 25c6e59f019e
children
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@61 56 'a@href' => BLOG_URL . "/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@61 74 $c_url = BLOG_URL . "/posts/{$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@61 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@61 131 '#calPrev@href' => BLOG_URL . '/posts/' . $prevYear . '/' . $prevMonth,
webmaster@11 132 '#calNext' => TextUtils::getMonthName($nextMonth) . ' ' . $nextYear,
webmaster@61 133 '#calNext@href' => BLOG_URL . '/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@61 204 'link@href' => BLOG_URL . '/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 ?>