Dotclear

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

Revision 3039, 15.6 KB checked in by Tomtom33, 12 years ago (diff)

mulitToc 1.6.3:

  • Added dotclear 2.3 accessibility compliance
  • Added dotclear 2.3 layout compliance
  • Changed default plugin icon
  • Fixed widget
  • 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 .= "\$meta_rs = \$meta->getMetadata(array('meta_type' => 'tag'));\n";
125               $p .= "\$_ctx->multitoc_group = \$meta->computeMetaStats(\$meta_rs);\n";
126               $p .= "\$_ctx->multitoc_group->sort('meta_id_lower',\$_ctx->multitoc_settings['tag']['order_group']);\n";
127          $p .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
128               $p .= "if (\$core->con->driver() == 'pgsql') :\n";
129                    $p .= "\$_ctx->multitoc_group = ".
130                    "multiTocPublic::multiTocGroupPGSQL(\$core,".
131                    "\$_ctx->multitoc_settings['alpha']['order_group']);\n";
132               $p .= "else :\n";
133                    $p .= "\$params['columns'] = array('UPPER(SUBSTRING(post_title,1,1)) AS post_letter','COUNT(*) as count');\n";
134                    $p .= "\$params['sql'] = 'GROUP BY post_letter';\n";
135                    $p .= "\$params['no_content'] = true;\n";
136                    $p .= "\$params['order'] = \$_ctx->multitoc_settings['alpha']['order_group'];\n";
137                    $p .= "\$_ctx->multitoc_group = \$core->blog->getPosts(\$params);\n";
138               $p .= "endif;\n";
139          $p .= "endif;\n";
140         
141          $res = "<?php\n";
142          $res .= $p;
143          $res .= "unset(\$params);\n";
144          $res .= "?>\n";
145         
146          $res .=
147          '<?php while ($_ctx->multitoc_group->fetch()) : ?>'.$content.'<?php endwhile; $_ctx->multitoc_group = null; $_ctx->multitoc_settings = null; ?>';
148         
149          return $res;
150     }
151     
152     public static function multiTocGroupTitle($attr)
153     {
154          $f = $GLOBALS['core']->tpl->getFilters($attr);
155         
156          $res = "<?php if (\$_ctx->multitoc_type == 'cat') :\n";
157               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->cat_title').";\n";
158          $res .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
159               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->meta_id').";\n";
160          $res .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
161               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->post_letter').";\n";
162          $res .= "endif; ?>\n";
163         
164          return $res;
165     }
166     
167     public static function multiTocGroupDesc($attr)
168     {
169          $f = $GLOBALS['core']->tpl->getFilters($attr);
170         
171          $res = "<?php if (\$_ctx->multitoc_type == 'cat') :\n";
172               $res .= "echo ".sprintf($f,'$_ctx->multitoc_group->cat_desc').";\n";
173          $res .= "endif; ?>\n";
174         
175          return $res;
176     }
177     
178     public static function multiTocGroupCount($attr)
179     {
180          $f = $GLOBALS['core']->tpl->getFilters($attr);
181         
182          $res = "<?php\n";
183          $res .= "\$mask = '<span class=\"toc-group-count\">%s</span>';\n";
184          $res .= "if (\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_entry']) :\n";
185               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->nb_post').".')');\n";
186          $res .= "elseif (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_entry']) :\n";
187               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->count').".')');\n";
188          $res .= "elseif (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_entry']) :\n";
189               $res .= "echo sprintf(\$mask,'('.".sprintf($f,'$_ctx->multitoc_group->count').".')');\n";
190          $res .= "endif;\n";
191          $res .= "?>\n";
192         
193          return $res;
194     }
195     
196     public static function multiTocItem($attr,$content)
197     {
198     
199          $p = "\$params = array();\n";
200          $p .= "\$params['no_content'] = true;\n";
201         
202          $p .= "if (\$_ctx->multitoc_type == 'cat') :\n";
203               $p .= "\$params['order'] = \$_ctx->multitoc_settings['cat']['order_entry'];\n";
204               $p .= "\$params['cat_id'] = \$_ctx->multitoc_group->cat_id;\n";
205               $p .= "\$_ctx->multitoc_items = \$core->blog->getPosts(\$params);\n";
206          $p .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
207               $p .= "\$params['meta_id'] = \$_ctx->multitoc_group->meta_id;\n";
208               $p .= "\$params['meta_type'] = 'tag';\n";
209               $p .= "\$params['post_type'] = '';\n";
210               $p .= "\$params['order'] = \$_ctx->multitoc_settings['tag']['order_entry'];\n";
211               $p .= "\$_ctx->multitoc_items = \$meta->getPostsByMeta(\$params);\n";
212          $p .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
213               $p .= "\$params['order'] = \$_ctx->multitoc_settings['alpha']['order_entry'];\n";
214               $p .= "\$params['sql'] = ' AND UPPER(SUBSTRING(post_title,1,1)) = \''.\$_ctx->multitoc_group->post_letter.'\'';\n";
215               $p .= "\$_ctx->multitoc_items = \$core->blog->getPosts(\$params);\n";
216          $p .= "endif;\n";
217         
218          $res = "<?php\n";
219          $res .= $p;
220          $res .= 'unset($params);'."\n";
221          $res .= "?>\n";
222         
223          $res .=
224          '<?php while ($_ctx->multitoc_items->fetch()) : ?>'.$content.'<?php endwhile; $_ctx->multitoc_items = null; ?>';
225         
226          return $res;
227     }
228     
229     public static function multiTocItemUrl($attr)
230     {
231          $f = $GLOBALS['core']->tpl->getFilters($attr);
232          return '<?php echo '.sprintf($f,'$_ctx->multitoc_items->getURL()').'; ?>';
233     }
234     
235     public static function multiTocItemTitle($attr)
236     {
237          $f = $GLOBALS['core']->tpl->getFilters($attr);
238          return '<?php echo '.sprintf($f,'$_ctx->multitoc_items->post_title').'; ?>';
239     }
240     
241     public static function multiTocItemDate($attr)
242     {
243          $f = $GLOBALS['core']->tpl->getFilters($attr);
244         
245          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\'<span class="toc-item-date">%s</span> - \'';
246         
247          $res = "<?php\n";
248          $res .= "\$mask = ".$mask.";\n";
249          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_date'])\n";
250          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_date'])\n";
251          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_date'])\n";
252          $res .= ") :\n";
253               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->getDate(\$_ctx->multitoc_settings[\$_ctx->multitoc_type]['format_date']));\n";
254          $res .= "endif;\n";
255          $res .= "?>\n";
256         
257          return $res;
258     }
259     
260     public static function multiTocItemAuthor($attr)
261     {
262          $f = $GLOBALS['core']->tpl->getFilters($attr);
263         
264          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-author">%s</span>\'';
265         
266          $res = "<?php\n";
267          $res .= "\$mask = ".$mask.";\n";
268          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_author'])\n";
269          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_author'])\n";
270          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_author'])\n";
271          $res .= ") :\n";
272               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->getAuthorLink());\n";
273          $res .= "endif;\n";
274          $res .= "?>\n";
275         
276          return $res;
277     }
278
279     public static function multiTocItemCategory($attr)
280     {
281          $f = $GLOBALS['core']->tpl->getFilters($attr);
282         
283          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-cat">%s</span>\'';
284         
285          $res = "<?php\n";
286          $res .= "\$mask = ".$mask.";\n";
287          $res .= "if (((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_cat'])\n";
288          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_cat'])\n";
289          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_cat']))\n";
290          $res .= "&& \$_ctx->multitoc_items->cat_title !== null\n";
291          $res .= ") :\n";
292               $res .= 
293               "\$link = sprintf('<a href=\"%1\$s\">%2\$s</a>',".
294               sprintf($f,'$core->blog->url.$core->url->getBase("category")."/".$_ctx->multitoc_items->cat_url').",".
295               sprintf($f,'$_ctx->multitoc_items->cat_title').");\n".
296               "echo sprintf(\$mask,\$link);\n";
297          $res .= "endif;\n";
298          $res .= "?>\n";
299         
300          return $res;
301     }
302
303     public static function multiTocItemNbComments($attr)
304     {
305          $f = $GLOBALS['core']->tpl->getFilters($attr);
306         
307          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-com">%s</span>\'';
308         
309          $res = "<?php\n";
310          $res .= "\$mask = ".$mask.";\n";
311          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_com'])\n";
312          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_com'])\n";
313          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_com'])\n";
314          $res .= ") :\n";
315               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->nb_comment);\n";
316          $res .= "endif;\n";
317          $res .= "?>\n";
318         
319          return $res;
320     }
321
322     public static function multiTocItemNbTrackbacks($attr)
323     {
324          $f = $GLOBALS['core']->tpl->getFilters($attr);
325         
326          $mask = isset($attr['mask']) ? sprintf($f,'"'.$attr['mask'].'"') : '\' - <span class="toc-item-tb">%s</span>\'';
327         
328          $res = "<?php\n";
329          $res .= "\$mask = ".$mask.";\n";
330          $res .= "if ((\$_ctx->multitoc_type == 'cat' && \$_ctx->multitoc_settings['cat']['display_nb_tb'])\n";
331          $res .= "|| (\$_ctx->multitoc_type == 'tag' && \$_ctx->multitoc_settings['tag']['display_nb_tb'])\n";
332          $res .= "|| (\$_ctx->multitoc_type == 'alpha' && \$_ctx->multitoc_settings['alpha']['display_nb_tb'])\n";
333          $res .= ") :\n";
334               $res .= "echo sprintf(\$mask,\$_ctx->multitoc_items->nb_trackback);\n";
335          $res .= "endif;\n";
336          $res .= "?>\n";
337         
338          return $res;
339     }
340     
341     public static function multiTocPageTitle()
342     {
343          $res = "<?php\n";
344          $res .= "echo __('Table of content');\n";
345         
346          $res .= "if (\$_ctx->multitoc_type == 'cat') :\n";
347               $res .= "echo ' - '.__('By category');\n";
348          $res .= "elseif (\$_ctx->multitoc_type == 'tag') :\n";
349               $res .= "echo ' - '.__('By tag');\n";
350          $res .= "elseif (\$_ctx->multitoc_type == 'alpha') :\n";
351               $res .= "echo ' - '.__('By alpha order');\n";
352          $res .= "endif;\n";
353          $res .= "?>\n";
354         
355          return $res;
356     }
357
358     public static function multiTocIf($attr,$content)
359     {
360          $if = array();
361         
362          $operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&';
363         
364          if (isset($attr['type'])) {
365               $if[] = "\$_ctx->multitoc_type == '".addslashes($attr['type'])."'";
366          }
367         
368          if (!empty($if)) {
369               return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
370          } else {
371               return $content;
372          }
373     }
374     
375     public static function multiTocMetaData($attr,$content)
376     {
377          $type = isset($attr['type']) ? addslashes($attr['type']) : 'tag';
378         
379          $sortby = 'meta_id_lower';
380          if (isset($attr['sortby']) && $attr['sortby'] == 'count') {
381               $sortby = 'count';
382          }
383         
384          $order = 'asc';
385          if (isset($attr['order']) && $attr['order'] == 'desc') {
386               $order = 'desc';
387          }
388         
389          $res =
390          "<?php\n".
391          '$objMeta = new dcMeta($core); '.
392          "\$_ctx->meta = \$objMeta->getMetaRecordset(\$_ctx->multitoc_items->post_meta,'".$type."'); ".
393          "\$_ctx->meta->sort('".$sortby."','".$order."'); ".
394          '?>';
395         
396          $res .= "<?php if (\$_ctx->multitoc_settings[\$_ctx->multitoc_type]['display_tag']) : ?>\n";
397          $res .= 
398          '<?php while ($_ctx->meta->fetch()) : ?>'.$content.'<?php endwhile; '.
399          '$_ctx->meta = null; unset($objMeta); ?>';
400          $res .= "<?php endif; ?>\n";
401         
402          return $res;
403     }
404}
405
406class multiTocPublic
407{
408     public static function multiTocGroupPGSQL($core,$order_group)
409     {
410          $params = array();
411          $params['columns'] = array(
412               'UPPER(SUBSTRING(post_title,1,1)) AS post_letter'
413          );
414          $params['no_content'] = true;
415          $params['order'] = $order_group;
416         
417          $rs = $core->blog->getPosts($params);
418         
419          $array = array();
420         
421          # the "post_letter" of the previous post in the list
422          $previous_letter = '';
423         
424          # read the "post_letter" field of the posts
425          # and count occurences of each letter
426          while ($rs->fetch())
427          {
428               # this letter
429               $letter = $rs->post_letter;
430               
431               # the letter has changed
432               if ($letter != $previous_letter)
433               {
434                    # the letter has changed but the previous letter was
435                    # the empty string, ignore this case
436                    if (!empty($previous_letter))
437                    {
438                         # store the previous letter,
439                         # which counter has been incremented
440                         $array[] = array(
441                              'post_letter' => $previous_letter,
442                              'count' => $letter_count
443                         );
444                    }
445                   
446                    # initialize the counter
447                    $letter_count = 1;
448                    # remember this letter to count it
449                    $previous_letter = $letter;
450               }
451               else
452               {
453                    # the letter has not changed, increment the counter
454                    $letter_count++;
455               }
456          }
457         
458          # don't forget the last letter
459          $array[] = array(
460               'post_letter' => $letter,
461               'count' => $letter_count
462          );
463         
464          return(staticRecord::newFromArray($array));
465     }
466}
467
468?>
Note: See TracBrowser for help on using the repository browser.

Sites map