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