Dotclear

source: plugins/moreTpl/_public.php @ 244

Revision 244, 12.2 KB checked in by olivier, 15 years ago (diff)

Fixed a bug in moreTpl.

Line 
1<?php
2
3# -- BEGIN LICENSE BLOCK ----------------------------------
4#
5# This file is part of Dotclear 2.
6#
7# Copyright (c) 2003-2008 Olivier Meunier and contributors
8# Licensed under the GPL version 2.0 license.
9# See LICENSE file or
10# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11#
12# -- END LICENSE BLOCK ------------------------------------
13
14if (!defined('DC_RC_PATH')) { 
15     return; 
16     }
17
18$core->tpl->addBlock('EntryIfPosition',array('tplMoreTpl','EntryIfPosition'));
19$core->tpl->addValue('EntryExcerptAndContent',array('tplMoreTpl','EntryExcerptAndContent'));
20$core->tpl->addValue('EntryCategoryShortURL',array('tplMoreTpl','EntryCategoryShortURL'));
21$core->tpl->addValue('CategoryEntriesCount',array('tplMoreTpl','CategoryEntriesCount'));
22$core->tpl->addValue('EntryCommentCountDigit',array('tplMoreTpl','EntryCommentCountDigit'));
23$core->tpl->addValue('EntryTrackbackCountDigit',array('tplMoreTpl','EntryTrackbackCountDigit'));
24$core->tpl->addValue('TagEntriesCount',array('tplMoreTpl','TagEntriesCount'));
25$core->tpl->addValue('CoreVersion',array('tplMoreTpl','CoreVersion'));
26$core->tpl->addValue('MetaSeparator',array('tplMoreTpl','MetaSeparator'));
27$core->tpl->addValue('EntryUpdate',array('tplMoreTpl','EntryUpdate'));
28$core->tpl->addBlock('PrevOrNextEntries',array('tplMoreTpl','PrevOrNextEntries'));
29
30$GLOBALS['__l10n']['Last update :'] = 'Dernière mise à jour :'; //pour EntryUpdate
31
32class tplMoreTpl
33{
34     /**
35     Fonction interne, ne peut pas être utilisée directement depuis le template
36     
37     @param    str       <b>string</b>       String to parse
38     @param    var       <b>string</b>       Tested variable name
39     @return   <b>string</b>
40     */
41     public static function testInExpr($str,$var)
42     {
43          $or = array();
44          foreach (explode(',',$str) as $v)
45          {
46               $v = trim($v);
47               $and = explode(' ',$v);
48               foreach ($and as $k_=>$v_)
49               {
50                    $v_ = trim($v_);
51                    $neg = false;
52                    $op = '==';
53                   
54                    # Not
55                    if (preg_match('/^!/',$v_)) {
56                         $v_ = substr($v_,1);
57                         $neg = true;
58                         $op = '!=';
59                    }
60                   
61                    # Number specification
62                    if (preg_match('/^[1-9][0-9]*$/',$v_,$m)) {
63                         $nb = (integer) $m[0];
64                         $res = $var.$op.$nb;
65                         $neg = false;
66                    }
67                    # Interval specification
68                    elseif (preg_match('/^([1-9][0-9]*)-([1-9][0-9]*)?$/',$v_,$m)) {
69                         $n1 = (integer) $m[1];
70                         if (isset($m[2])) {
71                              $n2 = (integer) $m[2];
72                              if ($n1 > $n2) {
73                                   list($n1,$n2) = array($n2,$n1);
74                              }
75                              $res = $var.'>='.$n1.' && '.$var.'<='.$n2;
76                         } else {
77                              $res = $var.'>='.$n1.'';
78                         }
79                    }
80                    # Step specification
81                    elseif (preg_match('#^/([1-9][0-9]*)(?:\+([0-9]+))?$#',$v_,$m)) {
82                         $n1 = (integer) $m[1];
83                         if (isset($m[2])) {
84                              $n2 = (integer) $m[2];
85                              $res = '('.$var.'-'.$n2.')%'.$n1.$op.'0';
86                         } else {
87                              $res = $var.'%'.$n1.$op.'0';
88                         }
89                         $neg = false;
90                    }
91                    # Odd items
92                    elseif ($v_ == 'odd') {
93                         $res = $var.'&1';
94                    }
95                    # Invalid format : cancel current alternative
96                    else {
97                         $res = 'false';
98                         $neg = false;
99                    }
100                   
101                    $res = ($neg ? '!' : '').'('.$res.')';
102                    $and[$k_] = $res;
103               }
104               $or[] = implode(' && ',$and);
105          }
106         
107          return implode(' || ',$or);
108     }
109
110     /**
111     Cette fonction vérifie la position du billet (1er, 2ème, 3ème, etc.)
112     par rapport à l'argument "is" spécifié, qui contient la liste des
113     positions acceptées, séparées par des virgules.
114     
115     Lisez la documentation en ligne pour plus de détails sur la syntaxe à
116     utiliser.
117     
118     Utilisation : <tpl:EntryIfPosition is="x,y,a-b odd,!z,/n+m">
119     */
120     public static function EntryIfPosition($attr,$content)
121     {
122          $is = isset($attr['is']) ? trim($attr['is']) : '';
123          $expr = self::testInExpr($is,'$idx');
124          return
125          '<?php $idx = $_ctx->posts->index()+1; if ('.$expr.'): ?>'.
126          $content.
127          '<?php endif; unset($idx); ?>';
128     }
129         
130     /**
131     Cette fonction recueille le contenu du post_chapo et du post_content
132     (par exemple pour lui appliquer un cut_string ou afficher le premier billet in extenso)
133     Utilisation : {{tpl:EntryExcerptAndContent}}
134     */
135     public static function EntryExcerptAndContent($attr)
136     {
137          $urls = '0';
138          if (!empty($attr['absolute_urls'])) {
139               $urls = '1';
140          }
141
142          $f = $GLOBALS['core']->tpl->getFilters($attr);
143
144          return
145          '<?php echo '.sprintf($f,'$_ctx->posts->getExcerpt('.$urls.').$_ctx->posts->getContent('.$urls.')').'; ?>';
146     }
147
148     /**
149     Cette fonction affiche le nom "URL" de la categorie dans le contexte d'un billet
150     (par exemple pour affecter une class dans la div post)
151     Utilisation : {{tpl:EntryCategoryShortURL}} -> Ma-jolie-categorie
152     */
153     public static function EntryCategoryShortURL($attr)
154     {
155          $f = $GLOBALS['core']->tpl->getFilters($attr);
156
157          return
158          '<?php echo '.sprintf($f,'$_ctx->posts->cat_url').'; ?>';
159     }
160
161     /**
162     Cette fonction affiche en chiffres le nombre de bilets d'une catégorie
163     (par exemple pour le content-info de category.html)
164     Utilisation : {{tpl:CategoryEntriesCount}} -> 3
165     */
166     public static function CategoryEntriesCount($attr)
167     {
168          $f = $GLOBALS['core']->tpl->getFilters($attr);
169
170          return
171          '<?php echo '.sprintf($f,'$_ctx->categories->nb_post').'; ?>';
172     }
173
174     /**
175     Cette fonction affiche le nombre de commentaires en chiffres et sans mention
176     Utilisation : {{tpl:EntryCommentCountDigit}} -> 4
177     */
178     public static function EntryCommentCountDigit($attr)
179     {
180          $none = '0';
181          $one = '1';
182          $more = '%d';
183
184          if (isset($attr['none'])) {
185               $none = addslashes($attr['none']);
186          }
187          if (isset($attr['one'])) {
188               $one = addslashes($attr['one']);
189          }
190          if (isset($attr['more'])) {
191               $more = addslashes($attr['more']);
192          }
193
194          return
195          "<?php if (\$_ctx->posts->nb_comment == 0) {\n".
196          "  printf(__('".$none."'),(integer) \$_ctx->posts->nb_comment);\n".
197          "} elseif (\$_ctx->posts->nb_comment == 1) {\n".
198          "  printf(__('".$one."'),(integer) \$_ctx->posts->nb_comment);\n".
199          "} else {\n".
200          "  printf(__('".$more."'),(integer) \$_ctx->posts->nb_comment);\n".
201          "} ?>";
202     }
203
204     /**
205     Cette fonction affiche le nombre de trackbacks en chiffres
206     Utilisation : {{tpl:EntryTrackbackCountDigit}} -> 2
207     */
208     public static function EntryTrackbackCountDigit($attr)
209     {
210          $none = '0';
211          $one = '1';
212          $more = '%d';
213
214          if (isset($attr['none'])) {
215               $none = addslashes($attr['none']);
216          }
217          if (isset($attr['one'])) {
218               $one = addslashes($attr['one']);
219          }
220          if (isset($attr['more'])) {
221               $more = addslashes($attr['more']);
222          }
223
224          return
225          "<?php if (\$_ctx->posts->nb_trackback == 0) {\n".
226          "  printf(__('".$none."'),(integer) \$_ctx->posts->nb_trackback);\n".
227          "} elseif (\$_ctx->posts->nb_trackback == 1) {\n".
228          "  printf(__('".$one."'),(integer) \$_ctx->posts->nb_trackback);\n".
229          "} else {\n".
230          "  printf(__('".$more."'),(integer) \$_ctx->posts->nb_trackback);\n".
231          "} ?>";
232     }
233     /**
234     Cette fonction affiche le nombre de billets correspondant à un tag
235     Utilisation (dans la page tags.html, tag.html ou une boucle <tpl:Metadata>) :
236     {{tpl:TagEntriesCount}} -> 12
237     */   
238     public static function TagEntriesCount($attr)
239     {
240         $f = $GLOBALS['core']->tpl->getFilters($attr);
241         $n = '$_ctx->meta->count';
242         return '<?php echo '.sprintf($f, $n).'; ?>';
243     }
244     /**
245          CoreVersion
246
247          Cette fonction affiche la version du noyau Dotclear d'après le champ core de la table version
248          (par exemple pour préciser la version après "Propulsé par Dotclear")
249          Utilisation : {{tpl:CoreVersion}} -> 2.0 RC1
250          */
251          public static function CoreVersion($attr)
252          {
253               $f = $GLOBALS['core']->tpl->getFilters($attr);
254
255               return
256               '<?php echo '.sprintf($f,'$GLOBALS["core"]->getVersion()').'; ?>';
257          }
258
259          /**
260          MetaSeparator
261
262          Cette fonction affiche un séparateur (qui peut être spécifié en paramètre) entre
263          les tags d'un billet. Cela permet par exemple d'utiliser une virgule comme
264          séparateur de tags et de ne pas avoir une virgule superflue qui traîne après
265          le dernier tag.
266
267          Paramètre du tag :
268            - separator : indique le texte à utiliser comme séparateur (valeur par défaut : ' - ')
269
270          Exemples d'utilisation :
271
272          Le bloc de code :
273            <tpl:EntryMetaData><a href="{{tpl:MetaURL}}">{{tpl:MetaID}}</a>{{tpl:MetaSeparator}}</tpl:EntryMetaData>
274          affiche une liste de tous les tags du billet en les séparant simplement par un tiret.
275          */
276          public static function MetaSeparator($attr)
277          {
278               $ret = isset($attr['separator']) ? $attr['separator'] : ' - ';
279               $ret = html::escapeHTML($ret);
280               return '<?php if (! $_ctx->meta->isEnd()) { ' . "echo '".addslashes($ret)."'; } ?>";
281          }
282
283          /**
284          EntryUpdate - auteur : Moe
285
286          Cette fonction affiche la date et l'heure de la dernière mise à jour du billet
287          Le format d'affichage répond à la syntaxe de la fonction strftime():
288               http://fr.php.net/manual/fr/function.strftime.php
289
290          Exemples d'utilisation :
291
292          {{tpl:EntryUpdateDate}} affichera "date_format, time_format"
293          où date_format et time_format sont les formats de l'affichage de
294          la date et de l'heure définis dans les "Paramètres du blog"
295
296          {{tpl:lang Last update :}} {{tpl:EntryUpdate format="%A %e %B %Y, %H:%M:%S"}}
297          affichera :
298          "Dernière mise à jour : vendredi 30 novembre 2007, 16:53:05"
299          */
300          public static function EntryUpdate($attr)
301          {
302               global $core;
303
304               $format = (!empty($attr['format'])) ? $attr['format'] : 
305                    $core->blog->settings->date_format.', '.$core->blog->settings->time_format; 
306               $f = $GLOBALS['core']->tpl->getFilters($attr);
307
308               return('<?php echo '.'dt::dt2str(\''.$format.'\','.sprintf($f,'$_ctx->posts->post_upddt').
309                    ',\''.$core->blog->settings->blog_timezone.'\'); ?>');
310          }
311
312          /**
313          PrevOrNextEntries
314
315          Cette fonction crée un bloc balise pour le template post.html qui permet d'afficher les x billets précédant ou suivant le billet courant. Possibilité de filtrer par langue, catégorie et de définir le nombre de résultats à retourner
316
317          Utilisation : <tpl:PrevOrNextEntries>[...]</tpl:PrevOrNextEntries>
318
319          Paramètres :
320          - Option "cat" accepte 0 pour exécuter la requête sur tous les posts ou 1 pour que ce ne soit que des billets de la même catégorie que le post en cours qui s'affichent => défaut 0
321          - Option "lng" (pour les blogs multilangues) accepte 0 pour trier tous les posts de toutes les langues ou 1 pour les billets de la même langue que le post en cours => défaut 0
322          - Option "dir" accepte 0 pour les x posts précédents ou 1 pour les x posts suivants => défaut 0
323          - Option "qty" accepte une valeur numérique qui correspondra au nombre de posts retournés par DC (dans la limite du nb total de posts publiés sans password) => défaut 2
324
325          Précision :
326          - Les 4 options sont utilisables simultanément vous pouvez donc afficher le billet suivant rédigé dans la même langue et publié dans la même catégorie à l'aide du code suivant :
327          - Si vous souhaitez utiliser la valeur par défaut de l'option, il est inutile, et même recommandé dans une démarche d'optimisation, de ne pas utiliser cet argument. Par exemple si vous souhaitez afficher les deux billets précédents parmi toutes les catégories et toutes les langues, le bloc de base indiqué dans "Utilisation" est suffisant.
328          */
329
330          public static function PrevOrNextEntries($attr,$content)
331          {
332               function getPrevOrNextPosts($post,$cat,$lng,$dir,$qty)
333               {
334               global $core;
335               if($cat==1) { $params['sql'] = $post->cat_id ? ' AND P.cat_id = '.$post->cat_id : ' AND P.cat_id IS NULL'; }
336               if($lng==1) { $params['sql'] .= $post->post_lang ? ' AND P.post_lang = \''.$core->con->escape($post->post_lang).'\'' : ' AND P.post_lang IS NULL'; }
337               if($dir==1) { $sign='>'; $order='ASC'; } else { $sign='<'; $order='DESC'; }
338               $dt = $post->post_dt; $post_id = $post->post_id;
339               $params['post_type'] = $post->post_type; $params['limit'] = $qty;  $params['order'] = 'post_dt '.$order.', P.post_id '.$order;
340               $params['sql'] .= ' AND ((post_dt = \''.$core->con->escape($dt).'\' AND P.post_id '.$sign.' '.$post_id.') OR post_dt '.$sign.' \''.$core->con->escape($dt).'\') ';
341               $rs = $core->blog->getPosts($params);
342               if ($rs->isEmpty()) {
343               return null;
344               }
345
346               return $rs;
347               }
348
349                    $cat = !empty($attr['cat']) ? $attr['cat'] : '0';
350                    $lng = !empty($attr['lng']) ? $attr['lng'] : '0';
351                    $dir = !empty($attr['dir']) ? $attr['dir'] : '0';
352                    $qty = !empty($attr['qty']) ? $attr['qty'] : '2';
353                    return '<?php $prev_post = getPrevOrNextPosts($_ctx->posts,'.$cat.','.$lng.','.$dir.','.$qty.'); ?>'."\n".
354                    '<?php if ($prev_post !== null) : ?>'.
355
356                         '<?php $_ctx->posts = $prev_post; unset($prev_post);'."\n".
357                         'while ($_ctx->posts->fetch()) : ?>'.
358                         $content.
359                         '<?php endwhile; $_ctx->posts = null; ?>'.
360                    "<?php endif; ?>\n";
361          }
362}
363?>
Note: See TracBrowser for help on using the repository browser.

Sites map