Staticpages dont have topics, things are never as simple as copy and paste...
3 /* Reminder: always indent with 4 spaces (no tabs). */
4 // +---------------------------------------------------------------------------+
5 // | Static Pages Plugin 1.6 |
6 // +---------------------------------------------------------------------------+
9 // | This file does two things: 1) it implements the necessary Geeklog Plugin |
10 // | API method and 2) implements all the common code needed by the Static |
11 // | Pages' PHP files. |
12 // +---------------------------------------------------------------------------+
13 // | Copyright (C) 2000-2009 by the following authors: |
15 // | Authors: Tony Bibbs - tony AT tonybibbs DOT com |
16 // | Tom Willett - twillett AT users DOT sourceforge DOT net |
17 // | Blaine Lang - blaine AT portalparts DOT com |
18 // | Dirk Haun - dirk AT haun-online DOT de |
19 // +---------------------------------------------------------------------------+
21 // | This program is free software; you can redistribute it and/or |
22 // | modify it under the terms of the GNU General Public License |
23 // | as published by the Free Software Foundation; either version 2 |
24 // | of the License, or (at your option) any later version. |
26 // | This program is distributed in the hope that it will be useful, |
27 // | but WITHOUT ANY WARRANTY; without even the implied warranty of |
28 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
29 // | GNU General Public License for more details. |
31 // | You should have received a copy of the GNU General Public License |
32 // | along with this program; if not, write to the Free Software Foundation, |
33 // | Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
35 // +---------------------------------------------------------------------------+
38 * Implementation of the Plugin API for the Static Pages plugin
40 * @package StaticPages
43 if (strpos(strtolower($_SERVER['PHP_SELF']), 'functions.inc') !== false) {
44 die('This file can not be used on its own.');
47 $plugin_path = $_CONF['path'] . 'plugins/staticpages/';
50 * Language file include
52 $langfile = $plugin_path . 'language/' . $_CONF['language'] . '.php';
53 if (file_exists($langfile)) {
54 require_once $langfile;
56 require_once $plugin_path . 'language/english.php';
60 * Check and see if we need to load the plugin configuration
62 if (!isset($_SP_CONF['allow_php'])) {
63 require_once $_CONF['path_system'] . 'classes/config.class.php';
65 $sp_config = config::get_instance();
66 $_SP_CONF = $sp_config->get_config('staticpages');
70 // +---------------------------------------------------------------------------+
71 // | Plugin API - Services |
72 // +---------------------------------------------------------------------------+
74 include_once $plugin_path . 'services.inc.php';
76 // +---------------------------------------------------------------------------+
77 // | Geeklog Plugin API Implementations |
78 // +---------------------------------------------------------------------------+
81 * Returns the items for this plugin that should appear on the main menu
83 * NOTE: this MUST return the url/value pairs in the following format
84 * $<arrayname>[<label>] = <url>
87 function plugin_getmenuitems_staticpages()
89 global $_CONF, $_TABLES, $_SP_CONF;
92 if (!empty ($_SP_CONF['sort_menu_by'])) {
93 $order = ' ORDER BY ';
94 if ($_SP_CONF['sort_menu_by'] == 'date') {
95 $order .= 'sp_date DESC';
96 } else if ($_SP_CONF['sort_menu_by'] == 'label') {
98 } else if ($_SP_CONF['sort_menu_by'] == 'title') {
100 } else { // default to "sort by id"
105 $result = DB_query('SELECT sp_id, sp_label FROM ' . $_TABLES['staticpage'] . ' WHERE sp_onmenu = 1' . COM_getPermSql('AND') . COM_getLangSql('sp_id', 'AND') . $order);
106 $nrows = DB_numRows ($result);
107 $menuitems = array ();
108 for ($i = 0; $i < $nrows; $i++) {
109 $A = DB_fetchArray ($result);
110 $menuitems[$A['sp_label']] = COM_buildURL ($_CONF['site_url'] . '/staticpages/index.php?page=' . $A['sp_id']);
117 * Plugin should display [a] comment[s]
119 * @param string $id Unique idenifier for item comment belongs to
120 * @param int $cid Comment id to display (possibly including sub-comments)
121 * @param string $title Page/comment title
122 * @param string $order 'ASC' or 'DSC' or blank
123 * @param string $format 'threaded', 'nested', or 'flat'
124 * @param int $page Page number of comments to display
125 * @param boolean $view True to view comment (by cid), false to display (by $pid)
126 * @return mixed results of calling the plugin_displaycomment_ function
128 function plugin_displaycomment_staticpages ($id, $cid, $title, $order, $format, $page, $view)
130 global $_TABLES, $LANG_ACCESS;
134 $sql = "SELECT COUNT(*) AS count, commentcode, owner_id, group_id, perm_owner, "
135 . "perm_group, perm_members, perm_anon "
136 . "FROM {$_TABLES['staticpage']} "
137 . "WHERE (sp_id = '$id')" . COM_getPermSQL('AND')
139 $result = DB_query ($sql);
140 $A = DB_fetchArray ($result);
141 $allowed = $A['count'];
144 $delete_option = (SEC_hasRights ('staticpages.edit') &&
145 (SEC_hasAccess ($A['owner_id'], $A['group_id'],
146 $A['perm_owner'], $A['perm_group'], $A['perm_members'],
147 $A['perm_anon']) == 3));
148 $retval .= CMT_userComments ($id, $title, 'staticpages', $order, $format,
149 $cid, $page, $view, $delete_option,
152 $retval .= COM_startBlock ($LANG_ACCESS['accessdenied'], '',
153 COM_getBlockTemplate ('_msg_block', 'header'))
154 . $LANG_ACCESS['storydenialmsg']
155 . COM_endBlock (COM_getBlockTemplate ('_msg_block', 'footer'));
162 * Static Page saves a comment
164 * @param string $title comment title
165 * @param string $comment comment text
166 * @param string $id Item id to which $cid belongs
167 * @param int $pid comment parent
168 * @param string $postmode 'html' or 'text'
169 * @return mixed false for failure, HTML string (redirect?) for success
171 function plugin_savecomment_staticpages($title, $comment, $id, $pid, $postmode)
173 global $_CONF, $_TABLES, $LANG03, $_USER;
177 $commentcode = DB_getItem($_TABLES['staticpage'], 'commentcode',
179 if ($commentcode != 0) {
180 return COM_refresh($_CONF['site_url'] . '/index.php');
183 $ret = CMT_saveComment($title, $comment, $id, $pid, 'staticpages', $postmode);
184 if ($ret > 0) { // failure //FIXME: some failures should not return to comment form
185 $retval .= COM_siteHeader('menu', $LANG03[1])
186 . CMT_commentForm($title, $comment, $id, $pid, 'staticpages',
187 $LANG03[14], $postmode)
191 if (($_CONF['commentsubmission'] == 1) &&
192 !SEC_hasRights('comment.submit')) {
195 $retval = COM_refresh ($_CONF['site_url']
196 . "/staticpages/index.php?page=$id$msg");
203 * staticpages: delete a comment
205 * @param int $cid Comment to be deleted
206 * @param string $id Item id to which $cid belongs
207 * @return mixed false for failure, HTML string (redirect?) for success
209 function plugin_deletecomment_staticpages($cid, $id)
211 global $_CONF, $_TABLES, $_USER;
215 $has_editPermissions = SEC_hasRights ('staticpages.edit');
216 $result = DB_query ("SELECT owner_id,group_id,perm_owner,perm_group,perm_members,perm_anon "
217 . "FROM {$_TABLES['staticpage']} WHERE sp_id = '{$id}'");
218 $A = DB_fetchArray ($result);
220 if ($has_editPermissions && SEC_hasAccess ($A['owner_id'],
221 $A['group_id'], $A['perm_owner'], $A['perm_group'],
222 $A['perm_members'], $A['perm_anon']) == 3) {
223 CMT_deleteComment($cid, $id, 'staticpages');
224 $retval .= COM_refresh ($_CONF['site_url']
225 . "/staticpages/index.php?page=$id");
227 COM_errorLog ("User {$_USER['username']} (IP: {$_SERVER['REMOTE_ADDR']}) "
228 . "tried to illegally delete comment $cid from staticpage $id");
229 $retval .= COM_refresh ($_CONF['site_url'] . '/index.php');
236 * Helper function: Count static pages visible to the current user
238 * @return int number of pages
241 function SP_countVisiblePages ()
245 $perms = SP_getPerms ();
246 if (!empty ($perms)) {
247 $perms = ' WHERE ' . $perms;
249 $result = DB_query ("SELECT COUNT(*) AS cnt FROM {$_TABLES['staticpage']}" . $perms);
250 $A = DB_fetchArray ($result);
256 * Prepare static page for display.
258 * @param string $page static page id
259 * @param array $A static page data
260 * @param string $comment_order sorting of comments
261 * @param string $comment_mode comment mode (nested, flat, etc.)
262 * @param int $msg optional message number
263 * @return string HTML for the static page
266 function SP_displayPage ($page, $A, $comment_order = 'ASC', $comment_mode = 'nested', $msg = 0)
268 global $_CONF, $_TABLES, $_USER,
269 $LANG01, $LANG11, $LANG_STATIC, $_IMAGE_TYPE, $_SP_CONF;
273 $sp_url = COM_buildUrl($_CONF['site_url'] . '/staticpages/index.php?page='
275 $headercode = '<link rel="canonical" href="' . $sp_url . '"' . XHTML . '>';
278 If ($_SP_CONF['meta_tags'] > 0) {
279 $meta_description = $A['meta_description'];
280 $meta_keywords = $A['meta_keywords'];
281 $headercode .= COM_createMetaTags($meta_description, $meta_keywords);
284 if ($A['sp_format'] == 'allblocks' OR $A['sp_format'] == 'leftblocks') {
285 $retval .= COM_siteHeader('menu', $A['sp_title'], $headercode);
287 if ($A['sp_format'] <> 'blankpage') {
288 $retval .= COM_siteHeader('none', $A['sp_title'], $headercode);
292 $retval .= COM_showMessage($msg, 'staticpages');
294 if (($A['sp_inblock'] == 1) && ($A['sp_format'] != 'blankpage')) {
295 $retval .= COM_startBlock (stripslashes ($A['sp_title']), $A['sp_help'],
296 COM_getBlockTemplate ('_staticpages_block', 'header'));
299 $spage = new Template( $_CONF['path'] . 'plugins/staticpages/templates/' );
300 $spage->set_var('xhtml', XHTML);
302 $spage->set_var('xmlns', ' xmlns="http://www.w3.org/1999/xhtml"');
304 $spage->set_var('site_url', $_CONF['site_url']);
305 $spage->set_var('layout_url', $_CONF['layout_url']);
306 $spage->set_var('site_admin_url', $_CONF['site_admin_url']);
307 $spage -> set_file( array('page'=>'staticpage.thtml',
308 'comments' => 'spcomments.thtml'));
310 if ($A['sp_format'] <> 'blankpage') {
311 if ($_CONF['hideprintericon'] == 0) {
312 $icon_url = $_CONF['layout_url'] . '/images/print.' . $_IMAGE_TYPE;
313 $attr = array('title' => $LANG_STATIC['printable_format']);
314 $printicon = COM_createImage($icon_url, $LANG01[65], $attr);
315 $print_url = COM_buildURL ($_CONF['site_url']
316 . '/staticpages/index.php?page=' . $page . '&disp_mode=print');
317 $icon = COM_createLink($printicon, $print_url);
318 $spage->set_var('print_icon', $icon);
320 if ((SEC_hasAccess ($A['owner_id'], $A['group_id'], $A['perm_owner'],
321 $A['perm_group'], $A['perm_members'], $A['perm_anon']) == 3) &&
322 SEC_hasRights ('staticpages.edit')) {
323 $icon_url = $_CONF['layout_url'] . '/images/edit.' . $_IMAGE_TYPE;
324 $attr = array('title' => $LANG_STATIC['edit']);
325 $editiconhtml = COM_createImage($icon_url, $LANG_STATIC['edit'], $attr);
326 $attr = array('class' => 'editlink','title' => $LANG_STATIC['edit']);
327 $url = $_CONF['site_admin_url']
328 . '/plugins/staticpages/index.php?mode=edit&sp_id=' . $page;
330 ' ' . COM_createLink(
331 $editiconhtml, //display
333 $attr //other attributes
335 $spage->set_var('edit_icon', $icon);
339 if($A['commentcode'] >= 0 ) {
340 $delete_option = (SEC_hasRights('staticpages.edit') &&
341 SEC_hasAccess($A['owner_id'], $A['group_id'],
342 $A['perm_owner'], $A['perm_group'], $A['perm_members'],
343 $A['perm_anon']) == 3 ? true : false);
344 require_once $_CONF['path_system'] . 'lib-comment.php';
345 $spage->set_var ('commentbar', CMT_userComments($page, $A['sp_title'], 'staticpages',
346 $comment_order, $comment_mode, 0, 1, false,
347 $delete_option, $A['commentcode']));
351 $content = SP_render_content (stripslashes ($A['sp_content']), $A['sp_php']);
352 $spage->set_var('content', $content );
354 $spage->set_var('info_separator', 'hidden');
355 if ($A['sp_format'] <> 'blankpage') {
356 $curtime = COM_getUserDateTimeFormat ($A['sp_date']);
357 if ($_SP_CONF['show_date'] == 1) {
358 $lastupdate = $LANG_STATIC['lastupdated']. ' ' . $curtime[0];
359 $spage->set_var('lastupdate', $lastupdate);
362 if ($_SP_CONF['show_hits'] == 1) {
363 if ($_SP_CONF['show_date'] == 1) {
364 $spage->set_var('info_separator','visible');
366 $hits = COM_numberFormat ($A['sp_hits']) . ' ' . $LANG_STATIC['hits'];
367 $spage->set_var('hits', $hits);
371 $retval .= $spage->finish($spage->parse('output', 'page'));
372 if (($A['sp_inblock'] == 1) && ($A['sp_format'] != 'blankpage')) {
373 $retval .= COM_endBlock (COM_getBlockTemplate ('_staticpages_block',
377 if ($A['sp_format'] <> 'blankpage') {
378 if (!isset($_USER['noboxes'])) {
379 if (empty($_USER['uid']) || ($_USER['uid'] == 1)) {
380 $_USER['noboxes'] = 0;
382 $_USER['noboxes'] = DB_getItem($_TABLES['userindex'],
383 'noboxes', "uid = '{$_USER['uid']}'");
387 if (($A['sp_format'] == 'allblocks') && ($_USER['noboxes'] != 1)) {
388 $retval .= COM_siteFooter(true);
389 } else if (($A['sp_format'] == 'leftblocks') || ($A['sp_format'] == 'noblocks')) {
390 $retval .= COM_siteFooter(false);
392 $retval .= COM_siteFooter();
400 * Prepare static page for print (i.e. display as "printable version").
402 * @param string $page static page id
403 * @param array $A static page data
404 * @return string HTML for the static page
407 function SP_printPage($page, $A)
409 global $_CONF, $_TABLES, $LANG01, $LANG_DIRECTION;
411 $template_path = staticpages_templatePath();
412 $print = new Template($template_path);
413 $print->set_file(array('print' => 'printable.thtml'));
414 $print->set_var('site_url', $_CONF['site_url']);
415 $print->set_var('site_admin_url', $_CONF['site_admin_url']);
416 $print->set_var('layout_url', $_CONF['layout_url']);
417 $print->set_var('site_name', $_CONF['site_name']);
418 $print->set_var('site_slogan', $_CONF['site_slogan']);
420 $print->set_var('direction', $LANG_DIRECTION);
421 COM_setLangIdAndAttribute($print);
422 $print->set_var('xhtml', XHTML);
423 $print->set_var('page_title', $_CONF['site_name'] . ' - '
424 . stripslashes($A['sp_title']));
425 $sp_url = COM_buildUrl($_CONF['site_url']
426 . '/staticpages/index.php?page=' . $page);
427 $print->set_var('sp_url', $sp_url);
428 $print->set_var('sp_title', stripslashes($A['sp_title']));
429 $print->set_var('sp_content',
430 SP_render_content(stripslashes($A['sp_content']), $A['sp_php']));
431 $print->set_var('sp_hits', COM_numberFormat($A['sp_hits']));
432 $printable = COM_buildURL($_CONF['site_url']
433 . '/staticpages/index.php?page=' . $page . '&mode=print');
434 $print->set_var('printable_url', $printable);
435 if ($A['commentcode'] >= 0) {
436 $commentsUrl = $sp_url . '#comments';
437 $comments = DB_count($_TABLES['comments'],
438 array('sid', 'type'), array($page, 'staticpages'));
439 $numComments = COM_numberFormat($comments);
440 $print->set_var('story_comments', $numComments);
441 $print->set_var('comments_url', $commentsUrl);
442 $print->set_var('comments_text', $numComments . ' ' . $LANG01[3]);
443 $print->set_var('comments_count', $numComments);
444 $print->set_var('lang_comments', $LANG01[3]);
445 $comments_with_count = sprintf($LANG01[121], $numComments);
448 $comments_with_count = COM_createLink($comments_with_count,
451 $print->set_var('comments_with_count', $comments_with_count);
453 $print->parse('output', 'print');
455 return $print->finish($print->get_var('output'));
459 * Prepare static page for display
461 * @param string $page static page id
462 * @param string $mode type of display to return ('', 'print', 'autotag'
463 * @param string $comment_order sorting of comments
464 * @param string $comment_mode comment mode (nested, flat, etc.)
465 * @param int $msg optional message number
466 * @return string HTML for the static page
469 function SP_returnStaticpage($page='', $mode='', $comment_order = 'ASC', $comment_mode = 'nested', $msg = 0)
471 global $_CONF, $_TABLES, $LANG_ACCESS, $LANG_STATIC, $LANG_LOGIN;
481 if (PLG_invokeService('staticpages', 'get', $args, $retval, $svc_msg) == PLG_RET_OK) {
483 if ($mode == 'print') {
484 $retval = SP_printPage($page, $retval);
485 } else if ($mode =='autotag') {
486 $retval = SP_render_content(stripslashes($retval['sp_content']), $retval['sp_php']);
488 $retval = SP_displayPage($page, $retval, $comment_order, $comment_mode, $msg);
491 // increment hit counter for page
492 DB_query("UPDATE {$_TABLES['staticpage']} SET sp_hits = sp_hits + 1 WHERE sp_id = '$page'");
500 * Shows the statistics for the Static Pages plugin on stats.php.
501 * If $showsitestats is 1 then we are to only print the overall stats in the
502 * 'site statistics box' otherwise we show the detailed stats
504 * @param int showsitestate Flag to let us know which stats to get
506 function plugin_showstats_staticpages($showsitestats)
508 global $_CONF, $_TABLES, $LANG_STATIC;
512 $perms = SP_getPerms();
513 if (!empty($perms)) {
514 $perms = ' AND ' . $perms;
516 $result = DB_query("SELECT sp_id,sp_title,sp_hits FROM {$_TABLES['staticpage']} WHERE sp_hits > 0" . $perms . ' ORDER BY sp_hits DESC LIMIT 10');
517 $nrows = DB_numRows($result);
519 require_once $_CONF['path_system'] . 'lib-admin.php';
522 array('text' => $LANG_STATIC['stats_page_title'],
524 'header_class' => 'stats-header-title'),
525 array('text' => $LANG_STATIC['stats_hits'],
526 'field' => 'sp_hits',
527 'header_class' => 'stats-header-count',
528 'field_class' => 'stats-list-count'),
531 $text_arr = array('has_menu' => false,
532 'title' => $LANG_STATIC['stats_headline']
534 for ($i = 0; $i < $nrows; $i++) {
535 $A = DB_fetchArray($result);
536 $A['sp_title'] = stripslashes($A['sp_title']);
537 $A['sid'] = COM_createLink($A['sp_title'],
538 COM_buildUrl($_CONF['site_url']
539 . "/staticpages/index.php?page={$A['sp_id']}"));
540 $A['sp_hits'] = COM_NumberFormat($A['sp_hits']);
543 $retval .= ADMIN_simpleList("", $header_arr, $text_arr, $data_arr);
545 $retval .= COM_startBlock($LANG_STATIC['stats_headline']);
546 $retval .= $LANG_STATIC['stats_no_hits'];
547 $retval .= COM_endBlock();
554 * New stats plugin API function for proper integration with the site stats
556 * @return array(item text, item count);
559 function plugin_statssummary_staticpages()
563 $total_pages = SP_countVisiblePages();
565 return array($LANG_STATIC['staticpages'], COM_numberFormat($total_pages));
569 * Geeklog is asking us to provide any new items that show up in the type
570 * drop-down on search.php. Let's let users search static pages!
573 function plugin_searchtypes_staticpages()
577 $tmp['staticpages'] = $LANG_STATIC['staticpages'];
584 * this searches for static pages matching the user query and returns an array of
585 * for the header and table rows back to search.php where it will be formated and
588 * @param string $query Keywords user is looking for
589 * @param date $datestart Start date to get results for
590 * @param date $dateend End date to get results for
591 * @param string $topic The topic they were searching in
592 * @param string $type Type of items they are searching, or 'all' (deprecated)
593 * @param int $author Get all results by this author
594 * @param string $keyType search key type: 'all', 'phrase', 'any'
595 * @param int $page page number of current search (deprecated)
596 * @param int $perpage number of results per page (deprecated)
599 function plugin_dopluginsearch_staticpages($query, $datestart, $dateend, $topic, $type, $author, $keyType, $page, $perpage)
601 global $_TABLES, $_DB_dbms, $LANG_STATIC, $LANG09;
603 // Make sure the query is SQL safe
604 $query = trim(addslashes($query));
606 $sql = "SELECT sp.sp_id AS id, sp.sp_title AS title, sp.sp_content AS description, ";
607 $sql .= "UNIX_TIMESTAMP(sp.sp_date) AS date, sp.sp_uid AS uid, sp.sp_hits AS hits, ";
608 $sql .= "CONCAT('/staticpages/index.php?page=', sp.sp_id) AS url ";
609 $sql .= "FROM {$_TABLES['staticpage']} AS sp,{$_TABLES['users']} AS u ";
610 $sql .= "WHERE (sp.sp_uid = u.uid) AND (sp_php <> 1) ";
611 $sql .= COM_getPermSQL('AND') . COM_getLangSQL('sp_id', 'AND', 'sp') . ' ';
613 if (!empty ($author)) {
614 $sql .= "AND (sp_uid = '$author') ";
617 $search_p = new SearchCriteria('staticpages', $LANG_STATIC['staticpages']);
619 $columns = array('title' => 'sp_title', 'sp_content');
620 $sql .= $search_p->getDateRangeSQL('AND', 'sp_date', $datestart, $dateend);
621 list($sql,$ftsql) = $search_p->buildSearchSQL($keyType, $query, $columns, $sql);
623 $search_p->setSQL($sql);
624 $search_p->setFTSQL($ftsql);
625 $search_p->setRank(3);
626 $search_p->setURLRewrite(true);
628 // Search static page comments
629 $sql = "SELECT c.cid AS id, c.title AS title, c.comment AS description, ";
630 $sql .= "UNIX_TIMESTAMP(c.date) AS date, c.uid AS uid, ";
632 // MSSQL has a problem when concatenating numeric values
633 if ($_DB_dbms == 'mssql') {
634 $sql .= "'/comment.php?mode=view&cid=' + CAST(c.cid AS varchar(10)) AS url ";
636 $sql .= "CONCAT('/comment.php?mode=view&cid=',c.cid) AS url ";
639 $sql .= "FROM {$_TABLES['users']} AS u, {$_TABLES['comments']} AS c ";
640 $sql .= "LEFT JOIN {$_TABLES['staticpage']} AS s ON ((s.sp_id = c.sid) ";
641 $sql .= COM_getPermSQL('AND',0,2,'s') . COM_getLangSQL('sid','AND','s') . ") ";
642 $sql .= "WHERE (u.uid = c.uid) AND (s.commentcode >= 0) AND (s.sp_date <= NOW()) ";
644 if (!empty($author)) {
645 $sql .= "AND (c.uid = '$author') ";
648 $search_c = new SearchCriteria('comments', array($LANG_STATIC['staticpages'],$LANG09[66]));
650 $columns = array('title' => 'c.title', 'comment');
651 $sql .= $search_c->getDateRangeSQL('AND', 'c_date', $datestart, $dateend);
652 list($sql, $ftsql) = $search_c->buildSearchSQL($keyType, $query, $columns, $sql);
654 $search_c->setSQL($sql);
655 $search_c->setFTSQL($ftsql);
656 $search_c->setRank(2);
658 return array($search_p, $search_c);
663 * This will put an option for static pages in the command and control block on
667 function plugin_cclabel_staticpages()
669 global $LANG_STATIC, $_CONF;
671 if (SEC_hasRights ('staticpages.edit,staticpages.delete', 'OR')) {
672 return array ($LANG_STATIC['staticpages'],
673 $_CONF['site_admin_url'] . '/plugins/staticpages/index.php',
674 plugin_geticon_staticpages ());
681 * returns the administrative option for this plugin
684 function plugin_getadminoption_staticpages()
686 global $_CONF, $_TABLES, $LANG_STATIC;
688 if (SEC_hasRights ('staticpages.edit,staticpages.delete', 'OR')) {
689 $result = DB_query ("SELECT COUNT(*) AS cnt FROM {$_TABLES['staticpage']}" . COM_getPermSQL ('WHERE', 0, 3));
690 $A = DB_fetchArray ($result);
691 $total_pages = $A['cnt'];
692 return array ($LANG_STATIC['staticpages'], $_CONF['site_admin_url'] . '/plugins/staticpages/index.php', $total_pages);
697 * Return SQL where statement with appropriate permissions
699 * Takes User id and permission and returns SQL where clause which will return
700 * the appropriate objects.
701 * This assumes that the table has the following security structure:
702 * owner_id | mediumint(8)
703 * group_id | mediumint(8)
704 * perm_owner | tinyint(1) unsigned
705 * perm_group | tinyint(1) unsigned
706 * perm_members | tinyint(1) unsigned
707 * perm_anon | tinyint(1) unsigned
708 * This will work with the standard GL tables
710 * @param string $table Table name (used in joins)
711 * @param int $access Access if blank read access 2 = read 3 = read/edit
712 * @param int $u_id User ID if blank current user
713 * @return string Where clause of sql statement
716 function SP_getPerms ($table = '', $access = '2', $u_id = '')
718 global $_USER, $_GROUPS;
720 if ($table != '') { $table .= '.'; }
723 if (isset ($_USER['uid'])) {
724 $uid = $_USER['uid'];
731 $GROUPS = SEC_getUserGroups ($uid);
737 $sql .= "((owner_id = '{$uid}') AND (perm_owner >= $access)) OR ";
739 $sql .= "((group_id IN (" . implode (',', $GROUPS) . ")) "
740 . "AND (perm_group >= $access)) OR (perm_members >= $access)";
742 $sql .= "perm_anon >= $access";
751 * Display static pages in the center block.
753 * @param where int where the static page will be displayed (0..3)
754 * @param page int page number
755 * @param topic string topic ID
756 * @return string HTML for the static page (can be empty)
758 function plugin_centerblock_staticpages ($where = 1, $page = 1, $topic ='')
760 global $_CONF, $_TABLES, $_SP_CONF, $LANG_STATIC, $_IMAGE_TYPE, $LANG01;
765 return $retval; // we only support page 1 at the moment ...
768 $moresql = "(sp_where = $where) AND ";
769 $displayFeatured = false;
771 // If there are no featured stories, we won't be called with $where == 2.
772 // So, if asked to display pages for the top of the page, check if we
773 // have pages to be displayed after the featured story and if there is
774 // no featured story, display those pages as well.
775 if (($where == 1) && ($_CONF['showfirstasfeatured'] == 0)) {
776 if (DB_count ($_TABLES['stories'], 'featured', 1) == 0) {
777 // no featured story found - redefine $moresql
778 $moresql = "(sp_where = 1 OR sp_where = 2) AND ";
779 $displayFeatured = true;
783 if (empty ($topic)) {
784 $moresql .= "((sp_tid = 'none') OR (sp_tid = 'all'))";
786 $moresql .= "((sp_tid = '{$topic}') OR (sp_tid = 'all'))";
789 if ($_SP_CONF['sort_by'] == 'date') {
790 $sort = 'sp_date DESC';
791 } else if ($_SP_CONF['sort_by'] == 'title') {
793 } else { // default to "sort by id"
796 if ($displayFeatured) {
797 $sort = 'sp_where,' . $sort;
800 $perms = SP_getPerms ();
801 if (!empty ($perms)) {
802 $perms = ' AND ' . $perms;
804 $spsql = "SELECT sp_id,sp_title,sp_content,sp_format,sp_date,sp_hits,owner_id,group_id,perm_owner,perm_group,perm_members,perm_anon,sp_php,sp_inblock,sp_help FROM {$_TABLES['staticpage']} WHERE (sp_centerblock = 1)" . COM_getLangSql ('sp_id', 'AND') . ' AND ' . $moresql . $perms . " ORDER BY " . $sort;
805 $result = DB_query ($spsql);
807 $pages = DB_numRows ($result);
809 for ($i = 0; $i < $pages; $i++) {
810 $S = DB_fetchArray ($result);
813 switch ($S['sp_format']) {
815 $retval .= COM_siteHeader ('none');
819 $retval .= COM_siteHeader ('menu');
822 if (isset($_GET['msg'])) {
823 $msg = COM_applyFilter($_GET['msg'], true);
825 $retval .= COM_showMessage($msg);
830 if (($S['sp_inblock'] == 1) && !empty ($S['sp_title'])
831 && (($where != 0) || ($S['sp_format'] != 'blankpage'))) {
832 $retval .= COM_startBlock ($S['sp_title'], $S['sp_help'],
833 COM_getBlockTemplate ('_staticpages_centerblock', 'header'));
836 $spage = new Template( $_CONF['path'] . 'plugins/staticpages/templates/' );
837 $spage->set_file( array('page'=>'centerblock.thtml'));
838 $spage->set_var('xhtml', XHTML);
839 $spage->set_var('site_url', $_CONF['site_url']);
840 $spage->set_var('layout_url', $_CONF['layout_url']);
841 $spage->set_var('site_admin_url', $_CONF['site_admin_url']);
843 if ($_CONF['hideprintericon'] == 0) {
844 $icon_url = $_CONF['layout_url'] . '/images/print.' . $_IMAGE_TYPE;
845 $attr = array('title' => $LANG_STATIC['printable_format']);
846 $printicon = COM_createImage($icon_url, $LANG01[65], $attr);
847 $print_url = COM_buildURL ($_CONF['site_url']
848 . '/staticpages/index.php?page=' . $S['sp_id'] . '&mode=print');
849 $icon = COM_createLink($printicon, $print_url);
850 $spage->set_var('print_icon', $icon);
852 if ((SEC_hasAccess ($S['owner_id'], $S['group_id'], $S['perm_owner'],
853 $S['perm_group'], $S['perm_members'], $S['perm_anon']) == 3) &&
854 SEC_hasRights ('staticpages.edit')) {
855 $icon_url = $_CONF['layout_url'] . '/images/edit.' . $_IMAGE_TYPE;
856 $attr = array('title' => $LANG_STATIC['edit']);
857 $editiconhtml = COM_createImage($icon_url, $LANG_STATIC['edit'], $attr);
858 $url = $_CONF['site_admin_url']
859 . '/plugins/staticpages/index.php?mode=edit&sp_id=' . $S['sp_id'];
860 $attr = array('class' => 'editlink','title' => $LANG_STATIC['edit']);
862 ' ' . COM_createLink(
863 $editiconhtml, //display
865 $attr //other attributes
867 $spage->set_var('edit_icon', $icon);
870 $spage->set_var('info_separator', 'hidden');
871 if ($_SP_CONF['show_date'] == 1) {
872 $curtime = COM_getUserDateTimeFormat($S['sp_date']);
873 $lastupdate = $LANG_STATIC['lastupdated']. ' ' . $curtime[0];
874 $spage->set_var('lastupdate', $lastupdate);
877 if ($_SP_CONF['show_hits'] == 1) {
878 if ($_SP_CONF['show_date'] == 1) {
879 $spage->set_var('info_separator', 'visible');
881 $hits = COM_numberFormat($S['sp_hits']) . ' '
882 . $LANG_STATIC['hits'];
883 $spage->set_var('hits', $hits);
886 $content = SP_render_content (stripslashes ($S['sp_content']), $S['sp_php']);
887 $spage->set_var('content', $content );
888 $retval .= $spage->finish($spage->parse('output', 'page'));
889 if (($S['sp_inblock'] == 1) && !empty ($S['sp_title'])
890 && (($where != 0) || ($S['sp_format'] != 'blankpage'))) {
891 $retval .= COM_endBlock (COM_getBlockTemplate ('_staticpages_centerblock', 'footer'));
895 if ($S['sp_format'] == 'allblocks') {
896 $retval .= COM_siteFooter (true);
897 } else if ($S['sp_format'] != 'blankpage') {
898 $retval .= COM_siteFooter ();
902 // increment hit counter for page
903 DB_query ("UPDATE {$_TABLES['staticpage']} SET sp_hits = sp_hits + 1 WHERE sp_id = '{$S['sp_id']}'");
911 * A user is about to be deleted. Update ownership of any static pages owned
912 * by that user or delete them.
914 * @param uid int User id of deleted user
917 function plugin_user_delete_staticpages($uid)
919 global $_TABLES, $_SP_CONF;
921 if (DB_count ($_TABLES['staticpage'], 'sp_uid', $uid) +
922 DB_count ($_TABLES['staticpage'], 'owner_id', $uid) == 0) {
926 if ($_SP_CONF['delete_pages'] == 1) {
928 DB_query ("DELETE FROM {$_TABLES['staticpage']} WHERE (sp_uid = $uid) OR (owner_id = $uid)");
930 // assign ownership to a user from the Root group
931 $rootgroup = DB_getItem ($_TABLES['groups'], 'grp_id',
932 "grp_name = 'Root'");
933 $result = DB_query ("SELECT DISTINCT ug_uid FROM {$_TABLES['group_assignments']} WHERE ug_main_grp_id = $rootgroup ORDER BY ug_uid LIMIT 1");
934 $A = DB_fetchArray ($result);
935 $rootuser = $A['ug_uid'];
937 DB_query ("UPDATE {$_TABLES['staticpage']} SET sp_uid = $rootuser WHERE sp_uid = $uid");
938 DB_query ("UPDATE {$_TABLES['staticpage']} SET owner_id = $rootuser WHERE owner_id = $uid");
944 * Return the current version of code.
945 * Used in the Plugin Editor to show the registered version and code version
947 function plugin_chkVersion_staticpages()
951 require_once $_CONF['path'] . 'plugins/staticpages/autoinstall.php';
953 $inst_parms = plugin_autoinstall_staticpages('staticpages');
955 return $inst_parms['info']['pi_version'];
959 * Implements the [staticpage:] autotag.
962 function plugin_autotags_staticpages($op, $content = '', $autotag = '')
964 global $_CONF, $_TABLES;
966 static $recursive = array();
968 if ($op == 'tagname' ) {
969 return array('staticpage', 'staticpage_content');
970 } else if ($op == 'parse') {
971 if ($autotag['tag'] == 'staticpage' ) {
972 $sp_id = COM_applyFilter($autotag['parm1']);
973 if (! empty($sp_id)) {
974 $url = COM_buildUrl($_CONF['site_url']
975 . '/staticpages/index.php?page=' . $sp_id);
976 if (empty($autotag['parm2'])) {
977 $linktext = stripslashes(DB_getItem($_TABLES['staticpage'],
978 'sp_title', "sp_id = '$sp_id'"));
980 $linktext = $autotag['parm2'];
982 $link = COM_createLink($linktext, $url);
983 $content = str_replace($autotag['tagstr'], $link, $content);
985 } else if ($autotag['tag'] == 'staticpage_content') {
986 $sp_id = COM_applyFilter($autotag['parm1']);
987 if (! empty($sp_id)) {
988 if (isset($recursive[$sp_id])) {
991 $recursive[$sp_id] = true;
992 $sp_content = SP_returnStaticpage($sp_id, 'autotag');
993 $content = str_replace($autotag['tagstr'], $sp_content,
1004 * Returns the URL of the plugin's icon
1006 * @return string URL of the icon
1009 function plugin_geticon_staticpages ()
1013 return $_CONF['site_url'] . '/staticpages/images/staticpages.png';
1017 * Update the Static Pages plugin
1019 * @return int Number of message to display (true = generic success msg)
1022 function plugin_upgrade_staticpages()
1024 global $_CONF, $_TABLES, $_DB_dbms;
1026 $installed_version = DB_getItem($_TABLES['plugins'], 'pi_version',
1027 "pi_name = 'staticpages'");
1028 $code_version = plugin_chkVersion_staticpages();
1029 if ($installed_version == $code_version) {
1034 require_once $_CONF['path'] . 'plugins/staticpages/autoinstall.php';
1036 if (! plugin_compatible_with_this_version_staticpages('staticpages')) {
1040 $inst_parms = plugin_autoinstall_staticpages('staticpages');
1041 $pi_gl_version = $inst_parms['info']['pi_gl_version'];
1043 require_once $_CONF['path'] . 'plugins/staticpages/sql/'
1044 . $_DB_dbms . '_updates.php';
1046 $current_version = $installed_version;
1049 switch ($current_version) {
1052 $current_version = '1.6.0';
1056 if (isset($_UPDATES[$current_version])) {
1057 $_SQL = $_UPDATES[$current_version];
1058 foreach ($_SQL as $sql) {
1063 update_ConfValues_1_6_0();
1065 $current_version = '1.6.1';
1073 DB_query("UPDATE {$_TABLES['plugins']} SET pi_version = '$code_version', pi_gl_version = '$pi_gl_version' WHERE pi_name = 'staticpages'");
1079 * Called during site migration - handle changed URLs or paths
1081 * @param array $old_conf contents of the $_CONF array on the old site
1082 * @param boolean true on success, otherwise false
1085 function plugin_migrate_staticpages($old_conf)
1090 'staticpage' => 'sp_id, sp_content'
1093 if ($old_conf['site_url'] != $_CONF['site_url']) {
1094 INST_updateSiteUrl($old_conf['site_url'], $_CONF['site_url'], $tables);
1101 * Automatic uninstall function for plugins
1105 * This code is automatically uninstalling the plugin.
1106 * It passes an array to the core code function that removes
1107 * tables, groups, features and php blocks from the tables.
1108 * Additionally, this code can perform special actions that cannot be
1109 * foreseen by the core code (interactions with other plugins for example)
1112 function plugin_autouninstall_staticpages ()
1115 /* give the name of the tables, without $_TABLES[] */
1116 'tables' => array('staticpage'),
1117 /* give the full name of the group, as in the db */
1118 'groups' => array('Static Page Admin', // correct Admin group name
1119 'Static Pages Admin' // typo in Geeklog 1.6.0
1121 /* give the full name of the feature, as in the db */
1122 'features' => array('staticpages.edit', 'staticpages.delete', 'staticpages.PHP'),
1123 /* give the full name of the block, including 'phpblock_', etc */
1124 'php_blocks' => array('phpblock_calendar'),
1125 /* give all vars with their name */
1133 * Get path for the template files.
1135 * @param string $path subdirectory within the base template path
1136 * @return string full path to template directory
1139 function staticpages_templatePath ($path = '')
1143 if (empty ($path)) {
1144 $layout_path = $_CONF['path_layout'] . 'staticpages';
1146 $layout_path = $_CONF['path_layout'] . 'staticpages/' . $path;
1149 if (is_dir ($layout_path)) {
1150 $retval = $layout_path;
1152 $retval = $_CONF['path'] . 'plugins/staticpages/templates';
1153 if (!empty ($path)) {
1154 $retval .= '/' . $path;
1161 function plugin_getListField_staticpages($fieldname, $fieldvalue, $A, $icon_arr)
1163 global $_CONF, $LANG_ADMIN, $LANG_STATIC, $_TABLES;
1165 switch($fieldname) {
1167 $retval = COM_createLink($icon_arr['edit'],
1168 "{$_CONF['site_admin_url']}/plugins/staticpages/index.php?mode=edit&sp_id={$A['sp_id']}");
1171 $retval = COM_createLink($icon_arr['copy'],
1172 "{$_CONF['site_admin_url']}/plugins/staticpages/index.php?mode=clone&sp_id={$A['sp_id']}");
1175 $sp_title = stripslashes ($A['sp_title']);
1176 $url = COM_buildUrl ($_CONF['site_url'] .
1177 '/staticpages/index.php?page=' . $A['sp_id']);
1178 $retval = COM_createLink($sp_title, $url, array('title'=>$LANG_STATIC['title_display']));
1181 $retval = COM_getDisplayName ($A['sp_uid']);
1183 case "sp_centerblock":
1184 if ($A['sp_centerblock']) {
1185 switch ($A['sp_where']) {
1186 case '1': $where = $LANG_STATIC['centerblock_top']; break;
1187 case '2': $where = $LANG_STATIC['centerblock_feat']; break;
1188 case '3': $where = $LANG_STATIC['centerblock_bottom']; break;
1189 default: $where = $LANG_STATIC['centerblock_entire']; break;
1193 $retval = $LANG_STATIC['centerblock_no'];
1197 $retval = strftime ($_CONF['daytime'], $A['unixdate']);
1200 $retval = $fieldvalue;
1207 * Render the actual content of a static page (without any surrounding blocks)
1209 * @param string $sp_content the content (HTML or PHP source)
1210 * @param int $sp_php flag: 1 = content is PHP source, 0 = is HTML
1211 * @return string rendered content (HTML)
1214 function SP_render_content ($sp_content, $sp_php)
1216 global $_SP_CONF, $LANG_STATIC;
1220 if ($_SP_CONF['allow_php'] == 1) {
1221 // Check for type (ie html or php)
1223 $retval = eval ($sp_content);
1224 } else if ($sp_php == 2) {
1227 $retval = ob_get_contents ();
1230 $retval = $sp_content;
1232 $retval = PLG_replacetags ($retval);
1235 COM_errorLog ("PHP in static pages is disabled. Can not display page '$page'.", 1);
1236 $retval .= $LANG_STATIC['deny_msg'];
1238 $retval .= PLG_replacetags ($sp_content);
1246 * Return true since this plugin supports webservices
1248 * @return bool True, if webservices are supported
1250 function plugin_wsEnabled_staticpages()
1256 * Return information for a static page
1258 * @param string $sp_id static page ID or '*'
1259 * @param string $what comma-separated list of properties
1260 * @param int $uid user ID or 0 = current user
1261 * @param array $options (reserved for future extensions)
1262 * @return mixed string or array of strings with the information
1265 function plugin_getiteminfo_staticpages($sp_id, $what, $uid = 0, $options = array())
1267 global $_CONF, $_TABLES;
1269 // parse $what to see what we need to pull from the database
1270 $properties = explode(',', $what);
1272 foreach ($properties as $p) {
1274 case 'date-modified':
1275 $fields[] = 'UNIX_TIMESTAMP(sp_date) AS unixdate';
1279 $fields[] = 'sp_content';
1280 $fields[] = 'sp_php';
1283 $fields[] = 'sp_id';
1286 $fields[] = 'sp_title';
1289 // needed for $sp_id == '*', but also in case we're only requesting
1290 // the URL (so that $fields isn't emtpy)
1291 $fields[] = 'sp_id';
1299 $fields = array_unique($fields);
1301 if (count($fields) == 0) {
1307 // prepare SQL request
1308 if ($sp_id == '*') {
1312 $where = " WHERE sp_id = '" . addslashes($sp_id) . "'";
1316 $permSql = COM_getPermSql($permOp, $uid);
1318 $permSql = COM_getPermSql($permOp);
1320 $sql = "SELECT " . implode(',', $fields)
1321 . " FROM {$_TABLES['staticpage']}" . $where . $permSql;
1322 if ($sp_id != '*') {
1326 $result = DB_query($sql);
1327 $numRows = DB_numRows($result);
1330 for ($i = 0; $i < $numRows; $i++) {
1331 $A = DB_fetchArray($result);
1334 foreach ($properties as $p) {
1336 case 'date-modified':
1337 $props['date-modified'] = $A['unixdate'];
1341 $props[$p] = SP_render_content(stripslashes($A['sp_content']),
1345 $props['id'] = $A['sp_id'];
1348 $props['title'] = stripslashes($A['sp_title']);
1351 if (empty($A['sp_id'])) {
1352 $props['url'] = COM_buildUrl($_CONF['site_url']
1353 . '/staticpages/index.php?page=' . $sp_id);
1355 $props['url'] = COM_buildUrl($_CONF['site_url']
1356 . '/staticpages/index.php?page=' . $A['sp_id']);
1360 // return empty string for unknown properties
1367 foreach ($props as $key => $value) {
1368 if ($sp_id == '*') {
1370 $mapped[$key] = $value;
1377 if ($sp_id == '*') {
1378 $retval[] = $mapped;
1385 if (($sp_id != '*') && (count($retval) == 1)) {
1386 $retval = $retval[0];
1393 * Provide URL of a documentation file
1395 * @param string $file documentation file being requested, e.g. 'config'
1396 * @return mixed URL or false when not available
1399 function plugin_getdocumentationurl_staticpages($file)
1408 if (isset($docurl)) {
1411 $doclang = COM_getLanguageName();
1412 $docs = 'docs/' . $doclang . '/staticpages.html';
1413 if (file_exists($_CONF['path_html'] . $docs)) {
1414 $retval = $_CONF['site_url'] . '/' . $docs;
1416 $retval = $_CONF['site_url'] . '/docs/english/staticpages.html';
1431 * Provide URL and ID for the link to a comment's parent
1433 * NOTE: The Plugin API does not support $_CONF['url_rewrite'] here,
1434 * so we'll end up with a non-rewritten URL ...
1436 * @return array array consisting of the base URL and the ID name
1439 function plugin_getcommenturlid_staticpages()
1444 $_CONF['site_url'] . '/staticpages/index.php',