Dotclear

source: plugins/multiToc/trunk/_public.php @ 2812

Revision 2812, 15.5 KB checked in by Tomtom33, 13 years ago (diff)

multiToc 1.6 :

  • Compatibility with stacker for post TOC
  • Fixed post TOC
  • Changed icons
  • Updated fr locales
  • Property svn:executable set to *
Line 
1<?php
2# -- BEGIN LICENSE BLOCK ----------------------------------
3# This file is part of multiToc, a plugin for Dotclear.
4#
5# Copyright (c) 2009-2010 Tomtom and contributors
6# http://blog.zenstyle.fr/
7#
8# Licensed under the GPL version 2.0 license.
9# A copy of this license is available in LICENSE file or at
10# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11# -- END LICENSE BLOCK ------------------------------------
12
13if (!defined('DC_RC_PATH')) { return; }
14
15$core->tpl->addValue('MultiTocUrl', array('multiTocTpl','multiTocUrl'));
16$core->tpl->addValue('MultiTocCss', array('multiTocTpl','multiTocCss'));
17$core->tpl->addValue('MultiTocGroupTitle', array('multiTocTpl','multiTocGroupTitle'));
18$core->tpl->addValue('MultiTocGroupDesc', array('multiTocTpl','multiTocGroupDesc'));
19$core->tpl->addValue('MultiTocGroupCount', array('multiTocTpl','multiTocGroupCount'));
20$core->tpl->addValue('MultiTocItemUrl', array('multiTocTpl','multiTocItemUrl'));
21$core->tpl->addValue('MultiTocItemTitle', array('multiTocTpl','multiTocItemTitle'));
22$core->tpl->addValue('MultiTocItemDate', array('multiTocTpl','multiTocItemDate'));
23$core->tpl->addValue('MultiTocItemCategory', array('multiTocTpl','multiTocItemCategory'));
24$core->tpl->addValue('MultiTocItemAuthor', array('multiTocTpl','multiTocItemAuthor'));
25$core->tpl->addValue('MultiTocItemNbComments', array('multiTocTpl','multiTocItemNbComments'));
26$core->tpl->addValue('MultiTocItemNbTrackbacks', array('multiTocTpl','multiTocItemNbTrackbacks'));
27$core->tpl->addValue('MultiTocPageTitle', array('multiTocTpl','multiTocPageTitle'));
28
29$core->tpl->addBlock('MultiTocGroup', array('multiTocTpl','multiTocGroup'));
30$core->tpl->addBlock('MultiTocItem', array('multiTocTpl','multiTocItem'));
31$core->tpl->addBlock('MultiTocIf',array('multiTocTpl','multiTocIf'));
32$core->tpl->addBlock('MultiTocMetaData',array('multiTocTpl','multiTocMetaData'));
33
34class multiTocUrl extends dcUrlHandlers
35{
36     public static function multiToc($args)
37     {
38          global $core,$_ctx;
39         
40          $settings = unserialize($core->blog->settings->multiToc->multitoc_settings);
41         
42          if ($settings['cat']['enable']) {
43               $types[] = 'cat';
44          }
45          if ($settings['tag']['enable']) {
46               $types[] = 'tag';
47          }
48          if ($settings['alpha']['enable']) {
49               $types[] = 'alpha';
50          }
51         
52          if (count($args) == 0) {
53               $type = 'cat';
54          }
55          elseif (count($args) == 1) {
56               $type = in_array($args,$types) ? $args : null;
57               unset($types);
58          }
59          else {
60               $type = null;
61          }
62         
63          $_ctx->multitoc_type = $type;
64         
65          if ($type === null) {
66               self::p404();
67          }
68          else {
69               self::serveDocument('multitoc.html');
70          }
71         
72          exit;
73     }
74}
75
76class multiTocTpl
77{
78
79     public static function multiTocUrl($attr)
80     {
81          $f = $GLOBALS['core']->tpl->getFilters($attr);
82          return '<?php echo '.sprintf($f,'$core->blog->url.$core->url->getBase("multitoc")').'; ?>';
83     }
84     
85     public static function multiTocCss()
86     {
87          global $core;
88         
89          $plop =
90               $core->blog->themes_path.'/'.
91               $core->blog->settings->system->theme.'/styles/multitoc.css';
92               
93          $tagada = $core->blog->themes_path.'/default/multitoc.css';
94         
95          if (file_exists($plop)) {
96               $css =
97                    $core->blog->settings->system->themes_url.'/'.
98                    $core->blog->settings->system->theme.'/styles/multitoc.css';
99          } elseif (file_exists($tagada)) {
100               $css =
101                    $core->blog->settings->system->themes_url.'/default/multitoc.css';
102          } else {
103               $css =
104                    $core->blog->url.
105                    (($core->blog->settings->system->url_scan == 'path_info')?'?':'').
106                    'pf=multiToc/css/multitoc.css';
107          }
108          $res =
109               "\n<?php \n".
110               "echo '<style type=\"text/css\" media=\"screen\">@import url(".$css.");</style>';\n".
111               "?>\n";
112               
113          return $res;
114     }
115     
116     public static function multiTocGroup($attr,$content)
117     {
118          $p = "\$_ctx->multitoc_settings = unserialize(\$core->blog->settings->multiToc->multitoc_settings);\n";
119          $p .= "\$params = array();\n";
120          $p .= "if (\$_ctx->multitoc_type == 'cat') :\n";
121               $p .= "\$_ctx->multitoc_group = \$core->blog->getCategories();\n";
122          $p .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
123               $p .= "\$meta = new dcMeta(\$core);\n";
124               $p .= "\$_ctx->multitoc_group = \$meta->getMeta('tag');\n";
125               $p .= "\$_ctx->multitoc_group->sort('meta_id_lower',\$_ctx->multitoc_settings['tag']['order_group']);\n";
126          $p .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
127               $p .= "if (\$core->con->driver() == 'pgsql') :\n";
128                    $p .= "\$_ctx->multitoc_group = ".
129                    "multiTocPublic::multiTocGroupPGSQL(\$core,".
130                    "\$_ctx->multitoc_settings['alpha']['order_group']);\n";
131               $p .= "else :\n";
132                    $p .= "\$params['columns'] = array('UPPER(SUBSTRING(post_title,1,1)) AS post_letter','COUNT(*) as count');\n";
133                    $p .= "\$params['sql'] = 'GROUP BY post_letter';\n";
134                    $p .= "\$params['no_content'] = true;\n";
135                    $p .= "\$params['order'] = \$_ctx->multitoc_settings['alpha']['order_group'];\n";
136                    $p .= "\$_ctx->multitoc_group = \$core->blog->getPosts(\$params);\n";
137               $p .= "endif;\n";
138          $p .= "endif;\n";
139         
140          $res = "<?php\n";
141          $res .= $p;
142          $res .= "unset(\$params);\n";
143          $res .= "?>\n";
144         
145          $res .=
146          '<?php while ($_ctx->multitoc_group->fetch()) : ?>'.$content.'<?php endwhile; $_ctx->multitoc_group = null; $_ctx->multitoc_settings = null; ?>';
147         
148          return $res;
149     }
150     
151     public static function multiTocGroupTitle($attr)
152     {
153          $f = $GLOBALS['core']->tpl->getFilters($attr);
154         
155          $res = "<?php if (\$_ctx->multitoc_type == 'cat') :\n";
156               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->cat_title').";\n";
157          $res .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
158               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->meta_id').";\n";
159          $res .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
160               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->post_letter').";\n";
161          $res .= "endif; ?>\n";
162         
163          return $res;
164     }
165     
166     public static function multiTocGroupDesc($attr)
167     {
168          $f = $GLOBALS['core']->tpl->getFilters($attr);
169         
170          $res = "<?php if (\$_ctx->multitoc_type == 'cat') :\n";
171               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->cat_desc').";\n";
172          $res .= "endif; ?>\n";
173         
174          return $res;
175     }
176     
177     public static function multiTocGroupCount($attr)
178     {
179          $f = $GLOBALS['core']->tpl->getFilters($attr);
180         
181          $res = "<?php\n";
182          $res .= "\$mask = '<span class=\"toc-group-count\">%s</span>';\n";
183          $res .= "if (\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_entry']) :\n";
184               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->nb_post').".')');\n";
185          $res .= "elseif (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_entry']) :\n";
186               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->count').".')');\n";
187          $res .= "elseif (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_entry']) :\n";
188               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->count').".')');\n";
189          $res .= "endif;\n";
190          $res .= "?>\n";
191         
192          return $res;
193     }
194     
195     public static function multiTocItem($attr,$content)
196     {
197     
198          $p = "\$params = array();\n";
199          $p .= "\$params['no_content'] = true;\n";
200         
201          $p .= "if (\$_ctx->multitoc_type == 'cat') :\n";
202               $p .= "\$params['order'] = \$_ctx->multitoc_settings['cat']['order_entry'];\n";
203               $p .= "\$params['cat_id'] = \$_ctx->multitoc_group->cat_id;\n";
204               $p .= "\$_ctx->multitoc_items = \$core->blog->getPosts(\$params);\n";
205          $p .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
206               $p .= "\$params['meta_id'] = \$_ctx->multitoc_group->meta_id;\n";
207               $p .= "\$params['meta_type'] = 'tag';\n";
208               $p .= "\$params['post_type'] = '';\n";
209               $p .= "\$params['order'] = \$_ctx->multitoc_settings['tag']['order_entry'];\n";
210               $p .= "\$_ctx->multitoc_items = \$meta->getPostsByMeta(\$params);\n";
211          $p .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
212               $p .= "\$params['order'] = \$_ctx->multitoc_settings['alpha']['order_entry'];\n";
213               $p .= "\$params['sql'] = ' AND UPPER(SUBSTRING(post_title,1,1)) = \''.\$_ctx->multitoc_group->post_letter.'\'';\n";
214               $p .= "\$_ctx->multitoc_items = \$core->blog->getPosts(\$params);\n";
215          $p .= "endif;\n";
216         
217          $res = "<?php\n";
218          $res .= $p;
219          $res .= 'unset($params);'."\n";
220          $res .= "?>\n";
221         
222          $res .=
223          '<?php while ($_ctx->multitoc_items->fetch()) : ?>'.$content.'<?php endwhile; $_ctx->multitoc_items = null; ?>';
224         
225          return $res;
226     }
227     
228     public static function multiTocItemUrl($attr)
229     {
230          $f = $GLOBALS['core']->tpl->getFilters($attr);
231          return '<?php echo '.sprintf($f,'$_ctx->multitoc_items->getURL()').'; ?>';
232     }
233     
234     public static function multiTocItemTitle($attr)
235     {
236          $f = $GLOBALS['core']->tpl->getFilters($attr);
237          return '<?php echo '.sprintf($f,'$_ctx->multitoc_items->post_title').'; ?>';
238     }
239     
240     public static function multiTocItemDate($attr)
241     {
242          $f = $GLOBALS['core']->tpl->getFilters($attr);
243         
244          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\'<span class="toc-item-date">%s</span> - \'';
245         
246          $res = "<?php\n";
247          $res .= "\$mask = ".$mask.";\n";
248          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_date'])\n";
249          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_date'])\n";
250          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_date'])\n";
251          $res .= ") :\n";
252               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->getDate(\$_ctx->multitoc_settings[\$_ctx->multitoc_type]['format_date']));\n";
253          $res .= "endif;\n";
254          $res .= "?>\n";
255         
256          return $res;
257     }
258     
259     public static function multiTocItemAuthor($attr)
260     {
261          $f = $GLOBALS['core']->tpl->getFilters($attr);
262         
263          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-author">%s</span>\'';
264         
265          $res = "<?php\n";
266          $res .= "\$mask = ".$mask.";\n";
267          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_author'])\n";
268          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_author'])\n";
269          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_author'])\n";
270          $res .= ") :\n";
271               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->getAuthorLink());\n";
272          $res .= "endif;\n";
273          $res .= "?>\n";
274         
275          return $res;
276     }
277
278     public static function multiTocItemCategory($attr)
279     {
280          $f = $GLOBALS['core']->tpl->getFilters($attr);
281         
282          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-cat">%s</span>\'';
283         
284          $res = "<?php\n";
285          $res .= "\$mask = ".$mask.";\n";
286          $res .= "if (((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_cat'])\n";
287          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_cat'])\n";
288          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_cat']))\n";
289          $res .= "&& \$_ctx->multitoc_items->cat_title !== null\n";
290          $res .= ") :\n";
291               $res .= 
292               "\$link = sprintf('<a href=\"%1\$s\">%2\$s</a>',".
293               sprintf($f,'$core->blog->url.$core->url->getBase("category")."/".$_ctx->multitoc_items->cat_url').",".
294               sprintf($f,'$_ctx->multitoc_items->cat_title').");\n".
295               "echo sprintf(\$mask,\$link);\n";
296          $res .= "endif;\n";
297          $res .= "?>\n";
298         
299          return $res;
300     }
301
302     public static function multiTocItemNbComments($attr)
303     {
304          $f = $GLOBALS['core']->tpl->getFilters($attr);
305         
306          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-com">%s</span>\'';
307         
308          $res = "<?php\n";
309          $res .= "\$mask = ".$mask.";\n";
310          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_com'])\n";
311          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_com'])\n";
312          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_com'])\n";
313          $res .= ") :\n";
314               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->nb_comment);\n";
315          $res .= "endif;\n";
316          $res .= "?>\n";
317         
318          return $res;
319     }
320
321     public static function multiTocItemNbTrackbacks($attr)
322     {
323          $f = $GLOBALS['core']->tpl->getFilters($attr);
324         
325          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-tb">%s</span>\'';
326         
327          $res = "<?php\n";
328          $res .= "\$mask = ".$mask.";\n";
329          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_tb'])\n";
330          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_tb'])\n";
331          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_tb'])\n";
332          $res .= ") :\n";
333               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->nb_trackback);\n";
334          $res .= "endif;\n";
335          $res .= "?>\n";
336         
337          return $res;
338     }
339     
340     public static function multiTocPageTitle()
341     {
342          $res = "<?php\n";
343          $res .= "echo __('Table of content');\n";
344         
345          $res .= "if (\$_ctx->multitoc_type == 'cat') :\n";
346               $res .= "echo ' - '.__('By category');\n";
347          $res .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
348               $res .= "echo ' - '.__('By tag');\n";
349          $res .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
350               $res .= "echo ' - '.__('By alpha order');\n";
351          $res .= "endif;\n";
352          $res .= "?>\n";
353         
354          return $res;
355     }
356
357     public static function multiTocIf($attr,$content)
358     {
359          $if = array();
360         
361          $operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&';
362         
363          if (isset($attr['type'])) {
364               $if[] = "\$_ctx->multitoc_type == '".addslashes($attr['type'])."'";
365          }
366         
367          if (!empty($if)) {
368               return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
369          } else {
370               return $content;
371          }
372     }
373     
374     public static function multiTocMetaData($attr,$content)
375     {
376          $type = isset($attr['type']) ? addslashes($attr['type']) : 'tag';
377         
378          $sortby = 'meta_id_lower';
379          if (isset($attr['sortby']) && $attr['sortby'] == 'count') {
380               $sortby = 'count';
381          }
382         
383          $order = 'asc';
384          if (isset($attr['order']) && $attr['order'] == 'desc') {
385               $order = 'desc';
386          }
387         
388          $res =
389          "<?php\n".
390          '$objMeta = new dcMeta($core); '.
391          "\$_ctx->meta = \$objMeta->getMetaRecordset(\$_ctx->multitoc_items->post_meta,'".$type."'); ".
392          "\$_ctx->meta->sort('".$sortby."','".$order."'); ".
393          '?>';
394         
395          $res .= "<?php if (\$_ctx->multitoc_settings[\$_ctx->multitoc_type]['display_tag']) : ?>\n";
396          $res .= 
397          '<?php while ($_ctx->meta->fetch()) : ?>'.$content.'<?php endwhile; '.
398          '$_ctx->meta = null; unset($objMeta); ?>';
399          $res .= "<?php endif; ?>\n";
400         
401          return $res;
402     }
403}
404
405class multiTocPublic
406{
407     public static function multiTocGroupPGSQL($core,$order_group)
408     {
409          $params = array();
410          $params['columns'] = array(
411               'UPPER(SUBSTRING(post_title,1,1)) AS post_letter'
412          );
413          $params['no_content'] = true;
414          $params['order'] = $order_group;
415         
416          $rs = $core->blog->getPosts($params);
417         
418          $array = array();
419         
420          # the "post_letter" of the previous post in the list
421          $previous_letter = '';
422         
423          # read the "post_letter" field of the posts
424          # and count occurences of each letter
425          while ($rs->fetch())
426          {
427               # this letter
428               $letter = $rs->post_letter;
429               
430               # the letter has changed
431               if ($letter != $previous_letter)
432               {
433                    # the letter has changed but the previous letter was
434                    # the empty string, ignore this case
435                    if (!empty($previous_letter))
436                    {
437                         # store the previous letter,
438                         # which counter has been incremented
439                         $array[] = array(
440                              'post_letter' => $previous_letter,
441                              'count' => $letter_count
442                         );
443                    }
444                   
445                    # initialize the counter
446                    $letter_count = 1;
447                    # remember this letter to count it
448                    $previous_letter = $letter;
449               }
450               else
451               {
452                    # the letter has not changed, increment the counter
453                    $letter_count++;
454               }
455          }
456         
457          # don't forget the last letter
458          $array[] = array(
459               'post_letter' => $letter,
460               'count' => $letter_count
461          );
462         
463          return(staticRecord::newFromArray($array));
464     }
465}
466
467?>
Note: See TracBrowser for help on using the repository browser.

Sites map