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 | |
---|
14 | if (!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 | |
---|
32 | class 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 | ?> |
---|