# HG changeset patch
# User Franck Deroche
# Date 1193249160 -7200
# Node ID ff57b45eda374ec5b3a57f8d63326272792100a5
# Parent 8f1125d270799f37a79796f37fdf821296fc58f7
Changement profond de l'index. Utilisation des templates.
Dual Blog utilise maintenant intimement la libraire de templates
que l'on peut trouver sur http://hg.defr.org/defr/templates,
ce qui permet d'eviter de mixer du code PHP avec du HTML.
Accessoirement, on est aussi assurer d'avoir du XML valide,
puisque c'est l'API DOM qui est utilisée pour générer la
sortie.
diff -r 8f1125d27079 -r ff57b45eda37 classes.php
--- a/classes.php Wed Oct 24 14:38:08 2007 +0200
+++ b/classes.php Wed Oct 24 20:06:00 2007 +0200
@@ -3,12 +3,19 @@
WebLog : Classe globale & all
*/
-ini_set("include_path", $_SERVER['DOCUMENT_ROOT'] . "/blog/includes/");
+$docRoot = $_SERVER['DOCUMENT_ROOT'];
+ini_set("include_path", "$docRoot/blog/includes/:$docRoot/blog/templates/");
+
+setlocale(LC_ALL, "fr_FR.utf8@euro", "fr_FR.utf8");
require_once("config.php");
require_once("class.dataaccess.php");
+require_once("class.post.php");
+require_once("class.template.php");
require_once("class.requete.php");
require_once("class.domutils.php");
require_once("class.textutils.php");
+require_once('class.skeleton.php');
+require_once("class.factory.php");
?>
diff -r 8f1125d27079 -r ff57b45eda37 includes/class.factory.php
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/class.factory.php Wed Oct 24 20:06:00 2007 +0200
@@ -0,0 +1,19 @@
+infos = (object)$infos;
+
+ // Récupération du template
+ $this->tpl = new Template('post.xml');
+
+ // Création du document fragment contenant le message
+ $Mess = str_replace(
+ array('
', '
'),
+ array('
', '
'),
+ $infos['Message']);
+ $Mess = Factory::getDB()->utf8_ensure($Mess);
+ $this->mess = $this->tpl->getDocumentFragment();
+ $this->mess->appendXML($Mess);
+
+ // Formatage de la date
+ $time = strtotime($infos['DatePost']);
+ $this->dateFormatee = strftime("%A %d %B %Y, %Hh%M", $time);
+
+ // On détermine l'url de ce post
+ $strippedTitle = TextUtils::StripTitle($infos['Titre']);
+ $this->url = '/blog/posts/' . $infos['num_mess'] . '-' . $strippedTitle;
+
+ // On détermine le label du lien vers les commentaires
+ $this->commentLabel = "Un p'tit commentaire ?";
+ if($infos['NbCommentaires'] > 0)
+ $this->commentLabel .= " (" . $infos['NbCommentaires'] . ")";
+
+ // On s'occupe de l'indicateur d'humeur
+ if(!empty($infos['Emot'])) {
+ $mood = array('src' => "/blog/mood/{$infos['Emot']}.png",
+ 'alt' => 'Mood: ' . $infos['Emot']);
+ $this->mood = (object)$mood;
+ }
+
+ // On détermine les tags du post
+ $db = Factory::getDB();
+ $nbTags = $db->Query("
+ SELECT T.Tag
+ FROM Tags T, Lien_Tags_Posts L
+ WHERE L.idMess={$infos['num_mess']} AND L.idTag = T.idTag
+ ORDER BY T.Tag
+ ", 2);
+ $tags = '';
+ if($nbTags > 0)
+ {
+ while(0 !== ($tag = $db->GetRow(2)))
+ $tags .= " {$tag['Tag']} |";
+ $tags = substr($tags, 0, -1);
+ $this->tags = $this->tpl->getDocumentFragment();
+ $this->tags->appendXML($tags);
+ }
+ else {
+ $this->tags = 'aucun';
+ }
+ }
+
+ public function format() {
+ $params = array(
+ '#post@class' => 'PostContent ' . $this->infos->Emot,
+ 'postTitle' => $this->infos->Titre,
+ 'postDate' => $this->dateFormatee,
+ 'postContent' => $this->mess,
+ 'postNumber' => $this->infos->num_mess,
+ 'postComments' => $this->commentLabel,
+ '#linkPostNumber@href' => $this->url,
+ '#linkPostComments@href' => $this->url,
+ 'postTags' => $this->tags
+ );
+ if(!empty($this->mood->src)) {
+ $params['#mood@src'] = $this->mood->src;
+ $params['#mood@alt'] = $this->mood->alt;
+ $params['#mood@class'] = 'mood';
+ }
+ $this->tpl->setParams($params);
+ return $this->tpl;
+ }
+}
+?>
diff -r 8f1125d27079 -r ff57b45eda37 includes/class.skeleton.php
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/class.skeleton.php Wed Oct 24 20:06:00 2007 +0200
@@ -0,0 +1,209 @@
+styleSheets = array();
+ $this->addDefaultSheets();
+ $this->blogPosts = array();
+ }
+
+ public function setTitle($titre) {
+ $this->setParams(array('title' => $titre));
+ }
+
+ private function buildSidebar() {
+ $sidebar = new Template('sidebar.xml');
+ // 1. Récupération des archives
+ $db = Factory::getDB();
+ $db->Query("
+ SELECT
+ MONTH(DatePost) As Month,
+ YEAR(DatePost) As Year,
+ COUNT(num_mess) As Nb
+ FROM Mess
+ GROUP BY
+ MONTH(DatePost),
+ YEAR(DatePost)
+ ORDER BY
+ YEAR(DatePost) DESC,
+ Month(DatePost) DESC
+ ");
+ $archives = array();
+ while($row = $db->GetRow()) {
+ $curArchiveTpl = new Template('archive.xml');
+ $monthName = TextUtils::getMonthName($row['Month']);
+ $curArchiveTpl->setParams(array(
+ 'a' => $monthName . ' ' . $row['Year'],
+ 'a@href' => "http://defr.org/blog/posts/{$row['Year']}/{$row['Month']}",
+ 'postCount' => '(' . $row['Nb'] . ')'
+ ));
+ $archives[] = array('li' => $curArchiveTpl);
+ }
+ // 2. Récupération des derniers commentaires
+ $db->Query("
+ SELECT C.*, M.Titre
+ FROM Commentaires C, Mess M
+ WHERE C.MessId = M.num_mess AND C.Visible=1
+ ORDER BY num_comm DESC LIMIT 20");
+ $i = 0;
+ $comments = array();
+ while($row = $db->GetRow()) {
+ $curCommentTpl = new Template('commentIndex.xml');
+ // On récupère une version filtrée du titre du post ...
+ $tf = TextUtils::StripTitle($row['Titre']);
+ // ... Qui nous permet d'obtenir l'adresse du commentaire sur le post
+ $c_url = "/blog/post/{$row['MessId']}-$tf#c{$row['num_comm']}";
+ // Si jamais on a une adresse mail, on rajoute un mailto:
+ if(strpos($row['Adresse'], '@') !== false)
+ $row['Adresse'] = 'mailto:' . $row['Adresse'];
+ // On commence par définir les paramètres généraux
+ $params = array(
+ '#CommentAuthor' => $row['Auteur'],
+ '#CommentAuthor@href' => $row['Adresse'],
+ '#Post' => $row['Titre'],
+ '#Post@href' => $c_url
+ );
+ // On affiche les 5 commentaires les plus récents en version complète
+ // puis les 15 autres en versions résumées
+ if($i < 5) {
+ $Comment = nl2br($row['Comment']);
+ }
+ else {
+ $Comment = str_replace("\n", " ", strip_tags($row['Comment']));
+ if(strlen($Comment > 100))
+ $Comment = utf8_encode(substr(utf8_decode($Comment), 0, 97)) . "...";
+ $params['li@class'] = 'fold';
+ }
+
+ $frag = $curCommentTpl->getDocumentFragment();
+ $frag->appendXML($Comment);
+ $params['comment'] = $frag;
+ $curCommentTpl->setParams($params);
+ $comments[] = array('blogComment' => $curCommentTpl);
+ $i++;
+ }
+ // 3. Application des paramètres
+ $sidebar->setParams(array(
+ '#archives' => $archives,
+ '#BlogCommentIndex' => $comments
+ ));
+ return $sidebar;
+ }
+
+ private function buildLinks() {
+ $links = new Template('links.xml');
+ return $links;
+ }
+
+ private function buildCalendar() {
+ $retVal = null;
+ if($this->showCalendar) {
+ $cMonth = $this->calendarMonth;
+ $cYear = $this->calendarYear;
+ $nextMonth = ($cMonth % 12) + 1;
+ $nextYear = ($nextMonth == 1) ? $cYear + 1 : $cYear;
+ $prevMonth = (($cMonth % 12) - 1) % 12;
+ $prevYear = ($prevMonth == 12) ? $cYear - 1 : $cYear;
+ $retVal = new Template('calendar.xml');
+ $retVal->setParams(array(
+ '#calPrev' => TextUtils::getMonthName($prevMonth) . ' ' . $prevYear,
+ '#calPrev@href' => '/blog/posts/' . $prevYear . '/' . $prevMonth,
+ '#calNext' => TextUtils::getMonthName($nextMonth) . ' ' . $nextYear,
+ '#calNext@href' => '/blog/posts/' . $nextYear . '/' . $nextMonth,
+ 'currentMonth' => TextUtils::getMonthName($cMonth) . ' ' . $cYear
+ ));
+ } else {
+ $retVal = '';
+ }
+ return $retVal;
+ }
+
+ public function addStyleSheet($SheetName, $CSSFile, $enabled = false) {
+ $this->styleSheets[] = (object)array(
+ 'name' => $SheetName,
+ 'CSSFile' => $CSSFile,
+ 'enabled' => $enabled
+ );
+ }
+
+ public function enableStyleSheet($styleSheetName) {
+ foreach($this->styleSheets as $styleSheet) {
+ $styleSheet->enabled = ($styleSheet->name == $styleSheetName);
+ }
+ }
+
+ public function addDefaultSheets() {
+ $StyleSheets = array(
+ "Somatic" => "Somatic.css",
+ "OliveVerde" => "OliveVerde.css",
+ "Lite:Reloaded" => "Lite_nv.css",
+ "Brushed" => "Brushed.css",
+ ":Hover" => "HoverExp.css");
+ $CkStyle = (array_key_exists("style", $_COOKIE) &&
+ array_key_exists($_COOKIE['style'], $StyleSheets))
+ ? $_COOKIE['style']
+ :"Somatic";
+ foreach($StyleSheets as $SheetName => $CSSFile)
+ $this->addStyleSheet($SheetName, $CSSFile, ($SheetName == $CkStyle));
+ }
+
+ public function addBlogPost(Template $blogPost) {
+ $this->blogPosts[] = $blogPost;
+ }
+
+ public function showCalendar($newValue = false) {
+ $this->showCalendar = $newValue;
+ }
+
+ public function setCalendarMonth($month, $year) {
+ $this->calendarMonth = $month;
+ $this->calendarYear = $year;
+ }
+
+ private function prepareOutput() {
+ $params = array();
+
+ // Ajout de la sidebar
+ $params['sidebar'] = $this->buildSideBar();
+
+ // Ajout de la liste des liens
+ $params['links'] = $this->buildLinks();
+
+ // Ajout des feuilles de style
+ $params['possibleStyleSheets'] = array();
+ foreach($this->styleSheets as $styleSheet) {
+ $type = ($styleSheet->enabled) ? "" : "Alternate ";
+ $type .= "StyleSheet";
+ $params['possibleStyleSheets'][] = array(
+ 'link@href' => '/blog/css/' . $styleSheet->CSSFile,
+ 'link@rel' => $type,
+ 'link@title' => $styleSheet->name
+ );
+ }
+
+ // Affichage éventuel des liens vers les mois précédents et suivants
+ $params['calendarPrevNext'] = $this->buildCalendar();
+
+ // Ajout des posts de blog
+ $params['#Posts'] = array();
+ foreach($this->blogPosts as $blogPost) {
+ $params['#Posts'][] = array('post' => $blogPost);
+ }
+
+ // Application des l'ensemble de ces paramètres
+ $this->setParams($params);
+ }
+
+ public function __toString() {
+ $this->prepareOutput();
+ return parent::__toString();
+ }
+}
+?>
diff -r 8f1125d27079 -r ff57b45eda37 includes/class.template.php
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/class.template.php Wed Oct 24 20:06:00 2007 +0200
@@ -0,0 +1,1 @@
+../../templates/class.template.php
\ No newline at end of file
diff -r 8f1125d27079 -r ff57b45eda37 index.php
--- a/index.php Wed Oct 24 14:38:08 2007 +0200
+++ b/index.php Wed Oct 24 20:06:00 2007 +0200
@@ -1,102 +1,46 @@
Connect();
- $query = ($type != 'cal') ?
- " SELECT *
- FROM Mess
+ require_once("classes.php");
+ $sk = Factory::getSkeleton();
+ $sk->setTitle('Dual { v10 : OS Edition } Blog');
+ // Détermination de la requête à exécuter
+ if(!array_key_exists('mode', $_GET)) {
+ $query = "
+ SELECT *
+ FROM Mess
WHERE num_version='Version 10'
ORDER BY num_mess DESC
LIMIT 10
- " : "
+ ";
+ } elseif($_GET['mode'] == 'cal') {
+ $sk->showCalendar(true);
+ $year = intval($_GET['year']);
+ $month = intval($_GET['month']);
+ $sk->setCalendarMonth($month, $year);
+ $query = "
SELECT *
- FROM Mess
- WHERE YEAR(DatePost)={$year} AND MONTH(DatePost)={$month}
+ FROM Mess
+ WHERE
+ YEAR(DatePost) = $year AND
+ MONTH(DatePost) = $month
ORDER BY num_mess DESC
- ";
- $Data->query($query);
- if($type == "cal") {
- echo("
Quelques informations sur cette version ? Ca va être un peu difficile étant donné que le choix a été fait de laisser au visiteur
+ le choix de l'apparence graphique de ce blog par le biais de feuilles de styles alternatives ( oui, je viens de pondre la traduction,
+ non je sais pas si c'est une bonne idée de traduire des termes techniques à 23h45 un 31 décembre ). Toutefois, pour ce qui est du style
+ par défaut, Somatic, je peux vous dire que les icones viennent du talentuex David Lanham,
+ pour The IconFactory, dans son set Somatic Windows
+
Quelques faits ? La magie de pouvoir changer l'apparence de ce site à volonté ( quatres versions disponible en lien ci-dessous pour
+ le moment, plus si vous utilisez un navigateur vous laissant choisir par lui-même l'apparence parce que vous aurez alors en bonus
+ les versions que je considère, erm, expérimentales ) est du essentiellement au tandem XHTML 1.1 et CSS 2.1, permettant
+ de séparer le contenu, c'est à dire les informations elles-même, de la facon dont elles sont affichés à l'écran, ce qui permet entre autre
+ ce que vous avez sous les yeux ^^;
Franck ( Deroche Franck, oui, la parodie de James Bond est nulle, et alors ? ), 20 ans
+ est un habitant de Plaisir, France, la Terre, petite planète
+ du système solaire paumée entre Venus et Mars. Il est actuellement en école d'ingénieur
+ à l'Ecole Centrale de Nantes : une école d'ingénieur
+ généraliste permettant de faire à peu près n'importe quel travail d'ingénieur en sortie.
+
Toutefois la spécialisation de Franck sera très certainement dans le domaine informatique, pour lequel
+ il éprouve une passion sans bornes. Normallement, de telles études devrait lui laisser assez
+ de temps pour qu'il puisse faire ce qu'il veut à côte, mais ce n'est que la théorie...
+
Enfin, Franck est en ce moment très ( très très ) amoureux d'une jeune demoiselle
+ particulièrement brillante et sympathique, extrement jolie, adepte de Zelda et du violet
+ qui se reconnaitra très certainement, et qui malheureusement n'habite pas vraiment très près de Nantes... Et en plus, elle ne considère même pas
+ les ordinateurs comme des choses bizarres venue d'ailleurs, pouvant même programmer pour le web ^^;
+
+
+
Like / Dislike
+
+
Qu'est-ce que Franck peut bien aimer ? Erf, bah, tout à la fois, pas grand chose et un nombre impressionant de machins qui pourrait un être normallement
+ constitué ne serait probablement rien d'autre que tout au plus des anecdotes. Toutefois, il faut bien avouer que son passe-temps majeur n'a rien de bien
+ original, puisqu'il s'agit de l'informatique, ce media des temps modernes sur lequel on entend à peu près tout et n'importe quoi. Et en ce qui concerne
+ l'informatique, on peut alors dire que Franck est on ne peut plus écléctique, touchant un peu à tout... Ce qui retient le plus son attention toutefois, en
+ ce moment du moins, reste la création de sites webs, la programmation et la customisation de son environement, à un point pouvant parfois friser le ridicule...
+
Lorsqu'il n'est pas collé à son écran, on a alors toutes les chances de le trouver en train de lire un bouquin, la lecture lui prenant elle aussi une partie non
+ négligeable de ses temps libres. Dans ce domaine aussi, l'eclectisme fait loi, il peut lire plus ou moins tout et n'importe quoi... Ces dernieres découvertes majeures en
+ la matiere sont probablement les bouquins de Werber ( qu'il a toutefois découvert depuis un certain temps maintenant ) et plus recement les mangas que sont Hunter x Hunter,
+ Naruto et surtout One Piece, qui l'ont amenés dans un univers ou il ne s'était curieusement que rarement aventuré.
+
Quant à sortir des deux occupations sus-mentionnées, il est difficile de donner une énumeration précise de ce qu'il aime faire, tant cela tant à l'anecdote : faire du cerf-volant sur la
+ plage avec le son des vagues en fond sonore, se baigner, etc.
+
Quant à ce qu'il n'aime pas, les réponses sont alors même pour lui moins évidente... Au niveau comportemental, c'est à dire dans ces relations avec les autres individus de l'espece humaine,
+ le tout pourrait se resumer par une formule bateau du type : qu'on ne respecte pas le cadre privé dans lequel il souhaite parfois se retrancher... En effet, Franck aime parfois
+ se retrouver livrer à lui-même, avoir des instants bien à lui où il n'est pas obligé d'expliquer ses agissements, et où tout simplement il n'est pas obliger de communiquer avec d'autres
+ individus à qui 'il n'a finalement rien à dire... D'autre part, il deteste se sentir exploiter, en mettant dans cette notion tout travail inutile pour lui, que ce soit au profit de
+ quelqu'un d'autre, ou même completement inutile à qui que ce soit. Toutefois, sa notion de l'utilitié semble legerement particulière, car passer un temps fou sur des jeux ne le dérange par
+ contre générallement pas le moins du monde...
+
+
+
Archives
+
+
Geekness n'était pas updaté depuis un bon bout de temps, la section va donc laisser sa place à quelques choses qui devrait à priori être
+ beaucoup plus utile, puisque je compte laisser des archives accessibles ^^; Eventuellement, des petits bonus pourrait atterir dans cette section,
+ comme une liste des posts jugés les plus dignes d'interet, ou un truc de ce genre. En tout cas, pour le moment, le voici, contenant la liste des
+ archives pour le moment disponible :
+ Archives :
+
+
+
+
+
+
Commentaires
+
+
Voici la liste des 5 derniers commentaires fait sur ce blog, tous posts
+confondus. Ca devrait permettre à tout le monde ( et notamment à moi-même ) de
+repérer les nouveaux commentaires qui arrivent, même s'ils le sont sur des posts
+vieux de 6 mois ^^