Dotclear

source: plugins/zoneclearFeedServer/_public.php @ 2915

Revision 2915, 17.7 KB checked in by JcDenis, 13 years ago (diff)

zoneclearFeedServer 1.3

  • Fixed install on nightly build
  • Fixed bug on null blog (and settings)
  • Added verbose on admin side
  • Added behaviors to open to others plugins (ie messenger)
  • Added support of plugin soCialMe (writer part)
  • Removed messenger functions (as it's to another plugin to do this)
Line 
1<?php
2# -- BEGIN LICENSE BLOCK ----------------------------------
3# This file is part of zoneclearFeedServer, a plugin for Dotclear 2.
4#
5# Copyright (c) 2009-2011 JC Denis, BG and contributors
6# jcdenis@gdwd.com
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# Namespace for settings
16$core->blog->settings->addNamespace('zoneclearFeedServer');
17
18# Widgets
19require_once dirname(__FILE__).'/_widgets.php';
20
21$core->addBehavior('coreBlogGetPosts',array('zoneclearFeedServerPublicBehaviors','coreBlogGetPosts'));
22
23if (!$core->blog->settings->zoneclearFeedServer->zoneclearFeedServer_active)
24{
25     return;
26}
27if (1 == $core->blog->settings->zoneclearFeedServer->zoneclearFeedServer_bhv_pub_upd)
28{
29     $core->addBehavior('publicBeforeDocument',array('zoneclearFeedServerPublicBehaviors','publicDocument'));
30}
31elseif (2 == $core->blog->settings->zoneclearFeedServer->zoneclearFeedServer_bhv_pub_upd)
32{
33     $core->addBehavior('publicAfterDocument',array('zoneclearFeedServerPublicBehaviors','publicAfterDocument'));
34}
35elseif (3 == $core->blog->settings->zoneclearFeedServer->zoneclearFeedServer_bhv_pub_upd)
36{
37     $core->addBehavior('publicHeadContent',array('zoneclearFeedServerPublicBehaviors','publicHeadContent'));
38}
39
40# Take care about tweakurls (thanks Mathieu M.)
41if (version_compare($core->plugins->moduleInfo('tweakurls','version'),'0.8','>=')) {
42     $core->addbehavior('zoneclearFeedServerAfterPostCreate',array('zoneclearFeedServer','tweakurlsAfterPostCreate'));
43}
44
45$core->tpl->addBlock('zcFeeds',array('zoneclearFeedServerTpl','Feeds'));
46$core->tpl->addValue('zcFeedsCount',array('zoneclearFeedServerTpl','FeedsCount'));
47$core->tpl->addValue('zcFeedsEntriesCount',array('zoneclearFeedServerTpl','FeedsEntriesCount'));
48$core->tpl->addBlock('zcFeedsFooter',array('zoneclearFeedServerTpl','FeedsFooter'));
49$core->tpl->addBlock('zcFeedsHeader',array('zoneclearFeedServerTpl','FeedsHeader'));
50$core->tpl->addValue('zcFeedEntriesCount',array('zoneclearFeedServerTpl','FeedEntriesCount'));
51$core->tpl->addValue('zcFeedCategory',array('zoneclearFeedServerTpl','FeedCategory'));
52$core->tpl->addValue('zcFeedCategoryID',array('zoneclearFeedServerTpl','FeedCategoryID'));
53$core->tpl->addValue('zcFeedCategoryURL',array('zoneclearFeedServerTpl','FeedCategoryURL'));
54$core->tpl->addValue('zcFeedCategoryShortURL',array('zoneclearFeedServerTpl','FeedCategoryShortURL'));
55$core->tpl->addValue('zcFeedID',array('zoneclearFeedServerTpl','FeedID'));
56$core->tpl->addBlock('zcFeedIf',array('zoneclearFeedServerTpl','FeedIf'));
57$core->tpl->addValue('zcFeedIfFirst',array('zoneclearFeedServerTpl','FeedIfFirst'));
58$core->tpl->addValue('zcFeedIfOdd',array('zoneclearFeedServerTpl','FeedIfOdd'));
59$core->tpl->addValue('zcFeedLang',array('zoneclearFeedServerTpl','FeedLang'));
60$core->tpl->addValue('zcFeedName',array('zoneclearFeedServerTpl','FeedName'));
61$core->tpl->addValue('zcFeedOwner',array('zoneclearFeedServerTpl','FeedOwner'));
62$core->tpl->addValue('zcFeedDesc',array('zoneclearFeedServerTpl','FeedDesc'));
63$core->tpl->addValue('zcFeedSiteURL',array('zoneclearFeedServerTpl','FeedSiteURL'));
64$core->tpl->addValue('zcFeedFeedURL',array('zoneclearFeedServerTpl','FeedFeedURL'));
65
66class zoneclearFeedServerPublicBehaviors
67{
68     # Remember others post extension
69     public static function coreBlogGetPosts($rs)
70     {
71          $GLOBALS['beforeZcFeedRsExt'] = $rs->extensions();
72          $rs->extend('zoneclearFeedServerPosts');
73     }
74
75     # Update feeds after contents
76     public static function publicAfterDocument($core)
77     {
78          # Limit feeds update to home page et feed page
79          # Like publishScheduledEntries
80          if (!in_array($core->url->type,array('default','feed'))) return;
81         
82          self::publicDocument($core);
83     }
84
85     # Generic behavior for before and after public content
86     public static function publicDocument($core)
87     {
88          $zc = new zoneclearFeedServer($core);
89          $zc->checkFeedsUpdate();
90          return;
91     }
92
93     # Update feeds by an Ajax request (background)
94     public static function publicHeadContent($core,$_ctx)
95     {
96          # Limit update to home page
97          if ($core->url->type != 'default') return;
98         
99          $blog_url = html::escapeJS($core->blog->url.$core->url->getBase('zoneclearFeedsPage').'/zcfsupd');
100          $blog_id = html::escapeJS($core->blog->id);
101         
102          echo
103          "\n<!-- JS for zoneclearFeedServer --> \n".
104          "<script type=\"text/javascript\" src=\"".
105               $core->blog->url.$core->url->getBase('zoneclearFeedsPage').'/zcfsupd.js">'.
106          "</script> \n".
107          "<script type=\"text/javascript\"> \n".
108          "//<![CDATA[\n".
109          " \$(function(){if(!document.getElementById){return;} ".
110          " $('body').zoneclearFeedServer({blog_url:'".$blog_url."',blog_id:'".$blog_id."'}); ".
111          " })\n".
112          "//]]>\n".
113          "</script>\n";
114     }
115}
116
117class zoneclearFeedServerPosts extends rsExtPost
118{
119     public static function zcFeed($rs,$info)
120     {
121          $p = array(
122               'post_id'=>$rs->post_id,
123               'meta_type'=>'zoneclearfeed_'.$info,
124               'limit'=>1
125          );
126          $meta = $rs->core->meta->getMetadata($p);
127         
128          return $meta->isEmpty() ? null : $meta->meta_id;
129     }
130     
131     public static function zcFeedBrother($type,$args)
132     {
133          if (!empty($GLOBALS['beforeZcFeedRsExt'][$type]))
134          {
135               $func = $GLOBALS['beforeZcFeedRsExt'][$type];
136          }
137          elseif (is_callable('rsExtPostPublic',$type))
138          {
139               $func = array('rsExtPostPublic',$type);
140          }
141          else
142          {
143               $func = array('rsExtPost',$type);
144          }
145          return call_user_func_array($func,$args);
146     }
147     
148     public static function getAuthorLink($rs)
149     {
150          $author = $rs->zcFeed('author');
151          $site = $rs->zcFeed('site');
152          $sitename = $rs->zcFeed('sitename');
153         
154          return ($author && $sitename) ?
155               $author.' (<a href="'.$site.'">'.$sitename.'</a>)' :
156               self::zcFeedBrother('getAuthorLink',array(&$rs));
157     }
158     
159     public static function getAuthorCN($rs)
160     {
161          $author = $rs->zcFeed('author');
162          return $author ? 
163               $author : 
164               self::zcFeedBrother('getAuthorCN',array(&$rs));
165     }
166     
167     public static function getURL($rs)
168     {
169          $url = $rs->zcFeed('url');
170          $types = @unserialize($rs->core->blog->settings->zoneclearFeedServer->zoneclearFeedServer_post_title_redir);
171          $full = is_array($types) && in_array($rs->core->url->type,$types);
172         
173          return $url && $full ? 
174               zoneclearFeedServer::absoluteURL($rs->zcFeed('site'),$url) : 
175               self::zcFeedBrother('getURL',array(&$rs));
176     }
177     
178     public static function getContent($rs,$absolute_urls=false)
179     {
180          $url = $rs->zcFeed('url');
181          $sitename = $rs->zcFeed('sitename');
182          $content = self::zcFeedBrother('getContent',array(&$rs,$absolute_urls));
183         
184          if ($url && $sitename && $rs->post_type == 'post')
185          {
186               $types = @unserialize($rs->core->blog->settings->zoneclearFeedServer->zoneclearFeedServer_post_full_tpl);
187               
188               if (is_array($types) && in_array($rs->core->url->type,$types))
189               {
190                    return $content .
191                    '<p class="zoneclear-original"><em>'.
192                    sprintf(__('Original post on <a href="%s">%s</a>'),$url,$sitename).
193                    '</em></p>';
194               }
195               else
196               {
197                    $content = context::remove_html($content);
198                    $content = context::cut_string($content,350);     
199                    $content = html::escapeHTML($content);
200                   
201                    return
202                    '<p>'.$content.'... '.
203                    '<em><a href="'.self::getURL($rs).'" title="'.__('Read more details about this feed').'">'.__('Continue reading').'</a></em></p>';
204               }
205          }
206          else
207          {
208               return $content;
209          }
210     }
211}
212
213class zoneclearFeedServerURL extends dcUrlHandlers
214{
215     public static function zcFeedsPage($args)
216     {
217          global $core, $_ctx;
218          $s = $core->blog->settings->zoneclearFeedServer;
219         
220          # Not active
221          if (!$s->zoneclearFeedServer_active)
222          {
223               self::p404();
224               return;
225          }
226         
227          # Update feeds (from ajax or other post resquest)
228          if ($args == '/zcfsupd' && 3 == $s->zoneclearFeedServer_bhv_pub_upd)
229          {
230               $msg = '';
231               if (!empty($_POST['blogId']) && html::escapeJS($core->blog->id) == $_POST['blogId'])
232               {
233                    try
234                    {
235                         $zc = new zoneclearFeedServer($core);
236                         if ($zc->checkFeedsUpdate())
237                         {
238                              $msg = '<status>ok</status><message>Feeds updated successfully</message>';
239                         }
240                    }
241                    catch (Exception $e) {}
242               }
243               if (empty($msg))
244               {
245                    $msg = '<status>failed</status><message>Failed to update feeds</message>';
246               }
247               
248               header('Content-Type: application/xml; charset=UTF-8');
249               echo 
250               '<?xml version="1.0" encoding="utf-8"?>'."\n".
251               '<response><rsp>'."\n".
252               $msg."\n".
253               '</rsp></response>';
254               exit(1);
255          }
256          # Server js
257          elseif ($args == '/zcfsupd.js' && 3 == $s->zoneclearFeedServer_bhv_pub_upd)
258          {
259               $core->tpl->setPath($core->tpl->getPath(),dirname(__FILE__).'/default-templates');
260               self::serveDocument('zcfsupd.js','text/javascript',false,false);
261               return;
262          }
263          # Server feeds description page
264          elseif (in_array($args,array('','/')) && $s->zoneclearFeedServer_pub_active)
265          {
266               $core->tpl->setPath($core->tpl->getPath(),dirname(__FILE__).'/default-templates');
267               self::serveDocument('zcfeeds.html');
268               return;
269          }
270          # Unknow
271          else
272          {
273               self::p404();
274               return;
275          }
276          return;
277     }
278}
279
280class zoneclearFeedServerTpl
281{
282     public static function Feeds($a,$c)
283     {
284          $lastn = -1;
285          if (isset($a['lastn']))
286          {
287               $lastn = abs((integer) $a['lastn'])+0;
288               $p .= "\$zcfs_params['limit'] = ".$lastn.";\n";
289          }
290          if (isset($a['cat_id']))
291          {
292               $p .= "@\$zcfs_params['sql'] .= 'AND Z.cat_id = ".addslashes($a['cat_id'])." ';\n";
293          }
294          if (isset($a['no_category']))
295          {
296               $p .= "@\$zcfs_params['sql'] .= 'AND Z.cat_id IS NULL ';\n";
297          }
298          if (!empty($a['site_url']))
299          {
300               $p .= "\$zcfs_params['feed_url'] = '".addslashes($a['site_url'])."';\n";
301          }
302          if (isset($a['feed_status']))
303          {
304               $p .= "\$zcfs_params['feed_status'] = ".((integer) $a['feed_status']).";\n";
305          }
306          else
307          {
308               $p .= "\$zcfs_params['feed_status'] = 1;\n";
309          }
310          if (!empty($a['feed_url']))
311          {
312               $p .= "\$zcfs_params['feed_feed'] = '".addslashes($a['feed_url'])."';\n";
313          }
314          if (isset($a['feed_owner']))
315          {
316               $p .= "@\$zcfs_params['sql'] .= \"AND Z.feed_owner = '".addslashes($a['author'])."' \";\n";
317          }
318         
319          $sortby = 'feed_creadt';
320          $order = 'desc';
321          if (isset($a['sortby']))
322          {
323               switch ($a['sortby'])
324               {
325                    case 'name': $sortby = 'lowername'; break;
326                    case 'owner' : $sortby = 'feed_owner'; break;
327                    case 'date' : $sortby = 'feed_dt'; break;
328                    case 'update' : $sortby = 'feed_upddt'; break;
329                    case 'id' : $sortby = 'feed_id'; break;
330               }
331          }
332          if (isset($a['order']) && preg_match('/^(desc|asc)$/i',$a['order']))
333          {
334               $order = $a['order'];
335          }
336          $p .= "\$zcfs_params['order'] = '".$sortby." ".$order."';\n";
337         
338          return 
339          '<?php '.$p.
340          '$_ctx->feeds_params = $zcfs_params;'."\n".
341          '$zcfs = new zoneclearFeedServer($core);'."\n".
342          '$_ctx->feeds = $zcfs->getFeeds($zcfs_params); unset($zcfs_params,$zcfs);'."\n".
343          "?>\n".
344          '<?php while ($_ctx->feeds->fetch()) : ?>'.$c.'<?php endwhile; '.
345          '$_ctx->feeds = null; $_ctx->feeds_params = null; ?>';
346     }
347     
348     public static function FeedIf($a,$c)
349     {
350          $if = array();
351         
352          $operator = isset($a['operator']) ? self::getOperator($a['operator']) : '&&';
353         
354          if (isset($a['type']))
355          {
356               $type = trim($a['type']);
357               $type = !empty($type) ? $type : 'feed';
358               $if[] = '$_ctx->feeds->feed_type == "'.addslashes($type).'"';
359          }
360          if (isset($a['site_url']))
361          {
362               $url = trim($a['feed_url']);
363               if (substr($url,0,1) == '!')
364               {
365                    $url = substr($url,1);
366                    $if[] = '$_ctx->feeds->feed_url != "'.addslashes($url).'"';
367               }
368               else
369               {
370                    $if[] = '$_ctx->feeds->feed_url == "'.addslashes($url).'"';
371               }
372          }
373          if (isset($a['feed_url']))
374          {
375               $url = trim($a['feed_feed']);
376               if (substr($url,0,1) == '!') 
377               {
378                    $url = substr($url,1);
379                    $if[] = '$_ctx->feeds->feed_feed != "'.addslashes($url).'"';
380               }
381               else
382               {
383                    $if[] = '$_ctx->feeds->feed_feed == "'.addslashes($url).'"';
384               }
385          }
386          if (isset($a['category']))
387          {
388               $category = addslashes(trim($a['category']));
389               if (substr($category,0,1) == '!')
390               {
391                    $category = substr($category,1);
392                    $if[] = '($_ctx->feeds->cat_url != "'.$category.'")';
393               }
394               else
395               {
396                    $if[] = '($_ctx->feeds->cat_url == "'.$category.'")';
397               }
398          }
399          if (isset($a['first']))
400          {
401               $sign = (boolean) $a['first'] ? '=' : '!';
402               $if[] = '$_ctx->feeds->index() '.$sign.'= 0';
403          }
404          if (isset($a['odd']))
405          {
406               $sign = (boolean) $a['odd'] ? '=' : '!';
407               $if[] = '($_ctx->feeds->index()+1)%2 '.$sign.'= 1';
408          }
409          if (isset($a['has_category']))
410          {
411               $sign = (boolean) $a['has_category'] ? '' : '!';
412               $if[] = $sign.'$_ctx->feeds->cat_id';
413          }
414          if (isset($a['has_description']))
415          {
416               $sign = (boolean) $a['has_description'] ? '' : '!';
417               $if[] = $sign.'$_ctx->feeds->feed_desc';
418          }
419         
420          if (!empty($if))
421          {
422               return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$c.'<?php endif; ?>';
423          }
424          else
425          {
426               return $c;
427          }
428     }
429     
430     public static function FeedIfFirst($a)
431     {
432          $ret = isset($a['return']) ? $a['return'] : 'first';
433          $ret = html::escapeHTML($ret);
434         
435          return
436          '<?php if ($_ctx->feeds->index() == 0) { '.
437          "echo '".addslashes($ret)."'; } ?>";
438     }
439     
440     public static function FeedIfOdd($a)
441     {
442          $ret = isset($a['return']) ? $a['return'] : 'odd';
443          $ret = html::escapeHTML($ret);
444         
445          return
446          '<?php if (($_ctx->feeds->index()+1)%2 == 1) { '.
447          "echo '".addslashes($ret)."'; } ?>";
448     }
449     
450     public static function FeedDesc($a)
451     {
452          return self::getValue($a,'$_ctx->feeds->feed_desc');
453     }
454     
455     public static function FeedOwner($a)
456     {
457          return self::getValue($a,'$_ctx->feeds->feed_owner');
458     }
459     
460     public static function FeedCategory($a)
461     {
462          return self::getValue($a,'$_ctx->feeds->cat_title');
463     }
464     
465     public static function FeedCategoryID($a)
466     {
467          return self::getValue($a,'$_ctx->feeds->cat_id');
468     }
469     
470     public static function FeedCategoryURL($a)
471     {
472          return self::getValue($a,'$core->blog->url.$core->url->getBase(\'category\').\'/\'.html::sanitizeURL($_ctx->feeds->cat_url)');
473     }
474     
475     public static function FeedCategoryShortURL($a)
476     {
477          return self::getValue($a,'$_ctx->feeds->cat_url');
478     }
479     
480     public static function FeedID($a)
481     {
482          return self::getValue($a,'$_ctx->feeds->feed_id');
483     }
484         
485     public static function FeedLang($a)
486     {
487          $f = $GLOBALS['core']->tpl->getFilters($a);
488          if (!empty($a['full']))
489          {
490               return '<?php $langs = l10n::getISOcodes(); if (isset($langs[$_ctx->feeds->feed_lang])) { echo '.sprintf($f,'$langs[$_ctx->feeds->feed_lang]').'; } else { echo '.sprintf($f,'$_ctx->feeds->feed_lang').'; } unset($langs); ?>';
491          }
492          else
493          {
494               return '<?php echo '.sprintf($f,'$_ctx->feeds->feed_lang').'; ?>';
495          }
496     }
497     
498     public static function FeedName($a)
499     {
500          return self::getValue($a,'$_ctx->feeds->feed_name');
501     }
502     
503     public static function FeedSiteURL($a)
504     {
505          return self::getValue($a,'$_ctx->feeds->feed_url');
506     }
507     
508     public static function FeedFeedURL($a)
509     {
510          return self::getValue($a,'$_ctx->feeds->feed_feed');
511     }
512     
513     public static function FeedsHeader($a,$c)
514     {
515          return "<?php if (\$_ctx->feeds->isStart()) : ?>".$c."<?php endif; ?>";
516     }
517     
518     public static function FeedsFooter($a,$c)
519     {
520          return "<?php if (\$_ctx->feeds->isEnd()) : ?>".$c."<?php endif; ?>";
521     }
522     
523     public static function FeedsCount($a)
524     {
525          $none = 'no source';
526          $one = 'one source';
527          $more = '%d sources';
528         
529          if (isset($a['none']))
530          {
531               $none = addslashes($a['none']);
532          }
533          if (isset($a['one']))
534          {
535               $one = addslashes($a['one']);
536          }
537          if (isset($a['more']))
538          {
539               $more = addslashes($a['more']);
540          }
541         
542          return
543          "<?php \$fcount = \$_ctx->feeds->count(); \n".
544          "if (\$fcount == 0) {\n".
545          "  printf(__('".$none."'),\$fcount);\n".
546          "} elseif (\$fcount == 1) {\n".
547          "  printf(__('".$one."'),\$fcount);\n".
548          "} else {\n".
549          "  printf(__('".$more."'),\$fcount);\n".
550          "} unset(\$fcount); ?>";
551     }
552     
553     public static function FeedsEntriesCount($a)
554     {
555          $none = 'no entry';
556          $one = 'one entry';
557          $more = '%d entries';
558         
559          if (isset($a['none']))
560          {
561               $none = addslashes($a['none']);
562          }
563          if (isset($a['one']))
564          {
565               $one = addslashes($a['one']);
566          }
567          if (isset($a['more']))
568          {
569               $more = addslashes($a['more']);
570          }
571         
572          return
573          "<?php \$fcount = 0; \$allfeeds = \$_ctx->feeds->zc->getFeeds(); \n".
574          "if (!\$allfeeds->isEmpty()) { \n".
575          " while (\$allfeeds->fetch()) { ".
576          \$fcount += (integer) \$_ctx->feeds->zc->getPostsByFeed(array('feed_id'=>\$allfeeds->feed_id),true)->f(0); ".
577          " } \n".
578          "} \n".
579          "if (\$fcount == 0) {\n".
580          "  printf(__('".$none."'),\$fcount);\n".
581          "} elseif (\$fcount == 1) {\n".
582          "  printf(__('".$one."'),\$fcount);\n".
583          "} else {\n".
584          "  printf(__('".$more."'),\$fcount);\n".
585          "} unset(\$allfeeds,\$fcount); ?>";
586     }
587     
588     public static function FeedEntriesCount($a)
589     {
590          $none = 'no entry';
591          $one = 'one entry';
592          $more = '%d entries';
593         
594          if (isset($a['none']))
595          {
596               $none = addslashes($a['none']);
597          }
598          if (isset($a['one']))
599          {
600               $one = addslashes($a['one']);
601          }
602          if (isset($a['more']))
603          {
604               $more = addslashes($a['more']);
605          }
606         
607          return
608          "<?php \$fcount = \$_ctx->feeds->zc->getPostsByFeed(array('feed_id'=>\$_ctx->feeds->feed_id),true)->f(0); \n".
609          "if (\$fcount == 0) {\n".
610          "  printf(__('".$none."'),\$fcount);\n".
611          "} elseif (\$fcount == 1) {\n".
612          "  printf(__('".$one."'),\$fcount);\n".
613          "} else {\n".
614          "  printf(__('".$more."'),\$fcount);\n".
615          "} unset(\$fcount); ?>";
616     }
617     
618     protected static function getValue($a,$v)
619     {
620          return '<?php echo '.sprintf($GLOBALS['core']->tpl->getFilters($a),$v).'; ?>';
621     }
622     
623     protected static function getOperator($op)
624     {
625          switch (strtolower($op))
626          {
627               case 'or':
628               case '||':
629                    return '||';
630               case 'and':
631               case '&&':
632               default:
633                    return '&&';
634          }
635     }
636}
637?>
Note: See TracBrowser for help on using the repository browser.

Sites map