| 
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 ?> |