Dotclear

source: plugins/moreTpl/_public.php @ 2246

Revision 2246, 12.0 KB checked in by xave, 13 years ago (diff)

Entry dates should be coherent with entry timezone.

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

Sites map