plugins/staticpages/functions.inc
author Tom <websitemaster@cogeco.net>
Thu, 15 Oct 2009 13:05:28 -0400
branchHEAD
changeset 7402 f7706912e8be
parent 7390 2b5aac1d58f8
child 7403 7a15ec67da80
permissions -rw-r--r--
Staticpages are now included in the What's New Block. Configuration option included to disable staticpages from displaying in the block if a centerblock and/or execute PHP code.

Staticpages now have the option to not be included in the search results of Geeklog. This can be limited to just pages that are centerblocks and/or execute PHP code.
     1 <?php
     2 
     3 /* Reminder: always indent with 4 spaces (no tabs). */
     4 // +---------------------------------------------------------------------------+
     5 // | Static Pages Plugin 1.6                                                   |
     6 // +---------------------------------------------------------------------------+
     7 // | functions.inc                                                             |
     8 // |                                                                           |
     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:                         |
    14 // |                                                                           |
    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 // +---------------------------------------------------------------------------+
    20 // |                                                                           |
    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.                    |
    25 // |                                                                           |
    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.                              |
    30 // |                                                                           |
    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.           |
    34 // |                                                                           |
    35 // +---------------------------------------------------------------------------+
    36 
    37 /**
    38 * Implementation of the Plugin API for the Static Pages plugin
    39 *
    40 * @package StaticPages
    41 */
    42 
    43 if (strpos(strtolower($_SERVER['PHP_SELF']), 'functions.inc') !== false) {
    44     die('This file can not be used on its own.');
    45 }
    46 
    47 $plugin_path = $_CONF['path'] . 'plugins/staticpages/';
    48 
    49 /**
    50 * Language file include
    51 */
    52 $langfile = $plugin_path . 'language/' . $_CONF['language'] . '.php';
    53 if (file_exists($langfile)) {
    54     require_once $langfile;
    55 } else {
    56     require_once $plugin_path . 'language/english.php';
    57 }
    58 
    59 /**
    60 * Check and see if we need to load the plugin configuration
    61 */
    62 if (!isset($_SP_CONF['allow_php'])) {
    63     require_once $_CONF['path_system'] . 'classes/config.class.php';
    64 
    65     $sp_config = config::get_instance();
    66     $_SP_CONF = $sp_config->get_config('staticpages');
    67 }
    68 
    69 
    70 // +---------------------------------------------------------------------------+
    71 // | Plugin API - Services                                                     |
    72 // +---------------------------------------------------------------------------+
    73 
    74 include_once $plugin_path . 'services.inc.php';
    75 
    76 // +---------------------------------------------------------------------------+
    77 // | Geeklog Plugin API Implementations                                        |
    78 // +---------------------------------------------------------------------------+
    79 
    80 /**
    81 * Returns the items for this plugin that should appear on the main menu
    82 *
    83 * NOTE: this MUST return the url/value pairs in the following format
    84 * $<arrayname>[<label>] = <url>
    85 *
    86 */
    87 function plugin_getmenuitems_staticpages()
    88 {
    89     global $_CONF, $_TABLES, $_SP_CONF;
    90 
    91     $order = '';
    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') {
    97             $order .= 'sp_label';
    98         } else if ($_SP_CONF['sort_menu_by'] == 'title') {
    99             $order .= 'sp_title';
   100         } else { // default to "sort by id"
   101             $order .= 'sp_id';
   102         }
   103     }
   104 
   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']);
   111     }
   112 
   113     return $menuitems;
   114 }
   115 
   116 /**
   117 * Plugin should display [a] comment[s]
   118 *
   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
   127 */
   128 function plugin_displaycomment_staticpages ($id, $cid, $title, $order, $format, $page, $view)
   129 {
   130     global $_TABLES, $LANG_ACCESS;
   131 
   132     $retval = '';
   133 
   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')
   138         . ' GROUP BY sp_id';
   139     $result = DB_query ($sql);
   140     $A = DB_fetchArray ($result);
   141     $allowed = $A['count'];
   142 
   143     if ($allowed == 1) {
   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,
   150                                      $A['commentcode']);
   151     } else {
   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'));
   156     }
   157 
   158     return $retval;
   159 }
   160 
   161 /**
   162  * Static Page saves a comment
   163  *
   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
   170  */
   171 function plugin_savecomment_staticpages($title, $comment, $id, $pid, $postmode)
   172 {
   173     global $_CONF, $_TABLES, $LANG03, $_USER;
   174 
   175     $retval = '';
   176 
   177     $commentcode = DB_getItem($_TABLES['staticpage'], 'commentcode',
   178                               "sp_id = '$id'");
   179     if ($commentcode != 0) {
   180         return COM_refresh($_CONF['site_url'] . '/index.php');
   181     }
   182 
   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)
   188                 . COM_siteFooter();
   189     } else { // success
   190         $msg = '';
   191         if (($_CONF['commentsubmission'] == 1) &&
   192                 !SEC_hasRights('comment.submit')) {
   193             $msg = '&msg=15';
   194         }
   195         $retval = COM_refresh ($_CONF['site_url']
   196                                 . "/staticpages/index.php?page=$id$msg");
   197     }
   198 
   199     return $retval;
   200 }
   201 
   202 /**
   203  * staticpages: delete a comment
   204  *
   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
   208  */
   209 function plugin_deletecomment_staticpages($cid, $id)
   210 {
   211     global $_CONF, $_TABLES, $_USER;
   212 
   213     $retval = '';
   214 
   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);
   219 
   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");
   226     } else {
   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');
   230     }
   231 
   232     return $retval;
   233 }
   234 
   235 /**
   236 * Helper function: Count static pages visible to the current user
   237 *
   238 * @return   int     number of pages
   239 *
   240 */
   241 function SP_countVisiblePages ()
   242 {
   243     global $_TABLES;
   244 
   245     $perms = SP_getPerms ();
   246     if (!empty ($perms)) {
   247         $perms = ' WHERE ' . $perms;
   248     }
   249     $result = DB_query ("SELECT COUNT(*) AS cnt FROM {$_TABLES['staticpage']}" . $perms);
   250     $A = DB_fetchArray ($result);
   251 
   252     return $A['cnt'];
   253 }
   254 
   255 /**
   256 * Prepare static page for display.
   257 *
   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
   264 *
   265 */
   266 function SP_displayPage ($page, $A, $comment_order = 'ASC', $comment_mode = 'nested', $msg = 0)
   267 {
   268     global $_CONF, $_TABLES, $_USER,
   269            $LANG01, $LANG11, $LANG_STATIC, $_IMAGE_TYPE, $_SP_CONF;
   270 
   271     $retval = '';
   272 
   273     $sp_url = COM_buildUrl($_CONF['site_url'] . '/staticpages/index.php?page='
   274                            . $page);
   275     $headercode = '<link rel="canonical" href="' . $sp_url . '"' . XHTML . '>';
   276 
   277     // Meta Tags
   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);
   282     }
   283 
   284     if ($A['sp_format'] == 'allblocks' OR $A['sp_format'] == 'leftblocks') {
   285         $retval .= COM_siteHeader('menu', $A['sp_title'], $headercode);
   286     } else {
   287         if ($A['sp_format'] <> 'blankpage') {
   288             $retval .= COM_siteHeader('none', $A['sp_title'], $headercode);
   289         }
   290     }
   291     if ($msg > 0) {
   292         $retval .= COM_showMessage($msg, 'staticpages');
   293     }
   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'));
   297     }
   298 
   299     $spage = new Template( $_CONF['path'] . 'plugins/staticpages/templates/' );
   300     $spage->set_var('xhtml', XHTML);
   301     if (XHTML != '') {
   302         $spage->set_var('xmlns', ' xmlns="http://www.w3.org/1999/xhtml"');
   303     }
   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'));
   309 
   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 . '&amp;disp_mode=print');
   317             $icon = COM_createLink($printicon, $print_url);
   318             $spage->set_var('print_icon', $icon);
   319         }
   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&amp;sp_id=' . $page;
   329             $icon =
   330                 '&nbsp;' . COM_createLink(
   331                 $editiconhtml, //display
   332                 $url,  //target
   333                 $attr //other attributes
   334             );
   335             $spage->set_var('edit_icon', $icon);
   336         }
   337     }
   338 
   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']));
   348     }
   349 
   350 
   351     $content = SP_render_content (stripslashes ($A['sp_content']), $A['sp_php']);
   352     $spage->set_var('content', $content );
   353 
   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);
   360         }
   361 
   362         if ($_SP_CONF['show_hits'] == 1) {
   363             if ($_SP_CONF['show_date'] == 1) {
   364                 $spage->set_var('info_separator','visible');
   365             }
   366             $hits = COM_numberFormat ($A['sp_hits']) . ' ' . $LANG_STATIC['hits'];
   367             $spage->set_var('hits', $hits);
   368         }
   369     }
   370 
   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',
   374                                                        'footer'));
   375     }
   376 
   377     if ($A['sp_format'] <> 'blankpage') {
   378         if (!isset($_USER['noboxes'])) {
   379             if (empty($_USER['uid']) || ($_USER['uid'] == 1)) {
   380                 $_USER['noboxes'] = 0;
   381             } else {
   382                 $_USER['noboxes'] = DB_getItem($_TABLES['userindex'],
   383                                         'noboxes', "uid = '{$_USER['uid']}'");
   384             }
   385         }
   386 
   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);
   391         } else {
   392             $retval .= COM_siteFooter();
   393         }
   394     }
   395 
   396     return $retval;
   397 }
   398 
   399 /**
   400 * Prepare static page for print (i.e. display as "printable version").
   401 *
   402 * @param    string  $page       static page id
   403 * @param    array   $A          static page data
   404 * @return   string              HTML for the static page
   405 *
   406 */
   407 function SP_printPage($page, $A)
   408 {
   409     global $_CONF, $_TABLES, $LANG01, $LANG_DIRECTION;
   410 
   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']);
   419 
   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 . '&amp;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);
   446 
   447         if ($comments > 0) {
   448             $comments_with_count = COM_createLink($comments_with_count,
   449                                                   $commentsUrl);
   450         }
   451         $print->set_var('comments_with_count', $comments_with_count);
   452     }
   453     $print->parse('output', 'print');
   454 
   455     return $print->finish($print->get_var('output'));
   456 }
   457 
   458 /**
   459 * Prepare static page for display
   460 *
   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
   467 *
   468 */
   469 function SP_returnStaticpage($page='', $mode='', $comment_order = 'ASC', $comment_mode = 'nested', $msg = 0)
   470 {
   471     global $_CONF, $_TABLES, $LANG_ACCESS, $LANG_STATIC, $LANG_LOGIN;
   472 
   473     $retval = '';
   474 
   475     $args = array(
   476                 'sp_id' => $page,
   477                 'mode'  => $mode
   478                  );
   479     $svc_msg = array();
   480 
   481     if (PLG_invokeService('staticpages', 'get', $args, $retval, $svc_msg) == PLG_RET_OK) {
   482 
   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']);
   487         } else {
   488             $retval = SP_displayPage($page, $retval, $comment_order, $comment_mode, $msg);
   489         }
   490 
   491         // increment hit counter for page
   492         DB_query("UPDATE {$_TABLES['staticpage']} SET sp_hits = sp_hits + 1 WHERE sp_id = '$page'");
   493 
   494     }
   495 
   496     return $retval;
   497 }
   498 
   499 /**
   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
   503 *
   504 * @param    int     showsitestate   Flag to let us know which stats to get
   505 */
   506 function plugin_showstats_staticpages($showsitestats)
   507 {
   508     global $_CONF, $_TABLES, $LANG_STATIC;
   509 
   510     $retval = '';
   511 
   512     $perms = SP_getPerms();
   513     if (!empty($perms)) {
   514         $perms = ' AND ' . $perms;
   515     }
   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);
   518     if ($nrows > 0) {
   519         require_once $_CONF['path_system'] . 'lib-admin.php';
   520 
   521         $header_arr = array(
   522             array('text'         => $LANG_STATIC['stats_page_title'],
   523                   'field'        => 'sid',
   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'),
   529         );
   530         $data_arr = array();
   531         $text_arr = array('has_menu' => false,
   532                           'title'    => $LANG_STATIC['stats_headline']
   533         );
   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']);
   541             $data_arr[$i] = $A;
   542         }
   543         $retval .= ADMIN_simpleList("", $header_arr, $text_arr, $data_arr);
   544     } else {
   545         $retval .= COM_startBlock($LANG_STATIC['stats_headline']);
   546         $retval .= $LANG_STATIC['stats_no_hits'];
   547         $retval .= COM_endBlock();
   548     }
   549 
   550     return $retval;
   551 }
   552 
   553 /**
   554 * New stats plugin API function for proper integration with the site stats
   555 *
   556 * @return   array(item text, item count);
   557 *
   558 */
   559 function plugin_statssummary_staticpages()
   560 {
   561     global $LANG_STATIC;
   562 
   563     $total_pages = SP_countVisiblePages();
   564 
   565     return array($LANG_STATIC['staticpages'], COM_numberFormat($total_pages));
   566 }
   567 
   568 /**
   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!
   571 *
   572 */
   573 function plugin_searchtypes_staticpages()
   574 {
   575     global $LANG_STATIC, $_SP_CONF;
   576 
   577     if ($_SP_CONF['includesearch'] == 1) {
   578         $tmp['staticpages'] = $LANG_STATIC['staticpages'];
   579         
   580         return $tmp;
   581     }
   582 }
   583 
   584 
   585 /**
   586 * this searches for static pages matching the user query and returns an array of
   587 * for the header and table rows back to search.php where it will be formated and
   588 * printed
   589 *
   590 * @param    string  $query      Keywords user is looking for
   591 * @param    date    $datestart  Start date to get results for
   592 * @param    date    $dateend    End date to get results for
   593 * @param    string  $topic      The topic they were searching in
   594 * @param    string  $type       Type of items they are searching, or 'all' (deprecated)
   595 * @param    int     $author     Get all results by this author
   596 * @param    string  $keyType    search key type: 'all', 'phrase', 'any'
   597 * @param    int     $page       page number of current search (deprecated)
   598 * @param    int     $perpage    number of results per page (deprecated)
   599 *
   600 */
   601 function plugin_dopluginsearch_staticpages($query, $datestart, $dateend, $topic, $type, $author, $keyType, $page, $perpage)
   602 {
   603     global $_TABLES, $_DB_dbms, $LANG_STATIC, $LANG09;
   604 
   605     // Make sure the query is SQL safe
   606     $query = trim(addslashes($query));
   607 
   608     $sql = "SELECT sp.sp_id AS id, sp.sp_title AS title, sp.sp_content AS description, ";
   609     $sql .= "UNIX_TIMESTAMP(sp.sp_date) AS date, sp.sp_uid AS uid, sp.sp_hits AS hits, ";
   610     $sql .= "CONCAT('/staticpages/index.php?page=', sp.sp_id) AS url ";
   611     $sql .= "FROM {$_TABLES['staticpage']} AS sp,{$_TABLES['users']} AS u ";
   612     $sql .= "WHERE (sp.sp_uid = u.uid) AND (sp_php <> 1) ";
   613     $sql .= COM_getPermSQL('AND') . COM_getLangSQL('sp_id', 'AND', 'sp') . ' ';
   614 
   615     if (!empty ($author)) {
   616         $sql .= "AND (sp_uid = '$author') ";
   617     }
   618 
   619     $search_p = new SearchCriteria('staticpages', $LANG_STATIC['staticpages']);
   620 
   621     $columns = array('title' => 'sp_title', 'sp_content');
   622     $sql .= $search_p->getDateRangeSQL('AND', 'sp_date', $datestart, $dateend);
   623     list($sql,$ftsql) = $search_p->buildSearchSQL($keyType, $query, $columns, $sql);
   624 
   625     $search_p->setSQL($sql);
   626     $search_p->setFTSQL($ftsql);
   627     $search_p->setRank(3);
   628     $search_p->setURLRewrite(true);
   629 
   630     // Search static page comments
   631     $sql = "SELECT c.cid AS id, c.title AS title, c.comment AS description, ";
   632     $sql .= "UNIX_TIMESTAMP(c.date) AS date, c.uid AS uid, ";
   633 
   634     // MSSQL has a problem when concatenating numeric values
   635     if ($_DB_dbms == 'mssql') {
   636         $sql .= "'/comment.php?mode=view&amp;cid=' + CAST(c.cid AS varchar(10)) AS url ";
   637     } else {
   638         $sql .= "CONCAT('/comment.php?mode=view&amp;cid=',c.cid) AS url ";
   639     }
   640 
   641     $sql .= "FROM {$_TABLES['users']} AS u, {$_TABLES['comments']} AS c ";
   642     $sql .= "LEFT JOIN {$_TABLES['staticpage']} AS s ON ((s.sp_id = c.sid) ";
   643     $sql .= COM_getPermSQL('AND',0,2,'s') . COM_getLangSQL('sid','AND','s') . ") ";
   644     $sql .= "WHERE (u.uid = c.uid) AND (s.commentcode >= 0) AND (s.sp_date <= NOW()) ";
   645 
   646     if (!empty($author)) {
   647         $sql .= "AND (c.uid = '$author') ";
   648     }
   649 
   650     $search_c = new SearchCriteria('comments', array($LANG_STATIC['staticpages'],$LANG09[66]));
   651 
   652     $columns = array('title' => 'c.title', 'comment');
   653     $sql .= $search_c->getDateRangeSQL('AND', 'c_date', $datestart, $dateend);
   654     list($sql, $ftsql) = $search_c->buildSearchSQL($keyType, $query, $columns, $sql);
   655 
   656     $search_c->setSQL($sql);
   657     $search_c->setFTSQL($ftsql);
   658     $search_c->setRank(2);
   659 
   660     return array($search_p, $search_c);
   661 }
   662 
   663 
   664 /**
   665 * This will put an option for static pages in the command and control block on
   666 * moderation.php
   667 *
   668 */
   669 function plugin_cclabel_staticpages()
   670 {
   671     global $LANG_STATIC, $_CONF;
   672 
   673     if (SEC_hasRights ('staticpages.edit,staticpages.delete', 'OR')) {
   674         return array ($LANG_STATIC['staticpages'],
   675                 $_CONF['site_admin_url'] . '/plugins/staticpages/index.php',
   676                 plugin_geticon_staticpages ());
   677     }
   678 
   679     return false;
   680 }
   681 
   682 /**
   683 * returns the administrative option for this plugin
   684 *
   685 */
   686 function plugin_getadminoption_staticpages()
   687 {
   688     global $_CONF, $_TABLES, $LANG_STATIC;
   689 
   690     if (SEC_hasRights ('staticpages.edit,staticpages.delete', 'OR')) {
   691         $result = DB_query ("SELECT COUNT(*) AS cnt FROM {$_TABLES['staticpage']}" . COM_getPermSQL ('WHERE', 0, 3));
   692         $A = DB_fetchArray ($result);
   693         $total_pages = $A['cnt'];
   694         return array ($LANG_STATIC['staticpages'], $_CONF['site_admin_url'] . '/plugins/staticpages/index.php', $total_pages);
   695     }
   696 }
   697 
   698 /**
   699 * Return SQL where statement with appropriate permissions
   700 *
   701 * Takes User id and permission and returns SQL where clause which will return
   702 * the appropriate objects.
   703 * This assumes that the table has the following security structure:
   704 * owner_id        | mediumint(8)
   705 * group_id        | mediumint(8)
   706 * perm_owner      | tinyint(1) unsigned
   707 * perm_group      | tinyint(1) unsigned
   708 * perm_members    | tinyint(1) unsigned
   709 * perm_anon       | tinyint(1) unsigned
   710 * This will work with the standard GL tables
   711 *
   712 * @param    string  $table  Table name (used in joins)
   713 * @param    int     $access Access if blank read access  2 = read 3 = read/edit
   714 * @param    int     $u_id   User ID if blank current user
   715 * @return   string          Where clause of sql statement
   716 *
   717 */
   718 function SP_getPerms ($table = '', $access = '2', $u_id = '')
   719 {
   720     global $_USER, $_GROUPS;
   721 
   722     if ($table != '') { $table .= '.'; }
   723 
   724     if ($u_id == '') {
   725         if (isset ($_USER['uid'])) {
   726             $uid = $_USER['uid'];
   727         } else {
   728             $uid = 1;
   729         }
   730         $GROUPS = $_GROUPS;
   731     } else {
   732         $uid = $u_id;
   733         $GROUPS = SEC_getUserGroups ($uid);
   734     }
   735 
   736     $sql = '(';
   737 
   738     if ($uid > 1) {
   739         $sql .= "((owner_id = '{$uid}') AND (perm_owner >= $access)) OR ";
   740 
   741         $sql .= "((group_id IN (" . implode (',', $GROUPS) . ")) "
   742              . "AND (perm_group >= $access)) OR (perm_members >= $access)";
   743     } else {
   744         $sql .= "perm_anon >= $access";
   745     }
   746 
   747     $sql .= ')';
   748 
   749     return $sql;
   750 }
   751 
   752 /**
   753 * Display static pages in the center block.
   754 *
   755 * @param   where   int      where the static page will be displayed (0..3)
   756 * @param   page    int      page number
   757 * @param   topic   string   topic ID
   758 * @return          string   HTML for the static page (can be empty)
   759 */
   760 function plugin_centerblock_staticpages ($where = 1, $page = 1, $topic ='')
   761 {
   762     global $_CONF, $_TABLES, $_SP_CONF, $LANG_STATIC, $_IMAGE_TYPE, $LANG01;
   763 
   764     $retval = '';
   765 
   766     if ($page > 1) {
   767         return $retval; // we only support page 1 at the moment ...
   768     }
   769 
   770     $moresql = "(sp_where = $where) AND ";
   771     $displayFeatured = false;
   772 
   773     // If there are no featured stories, we won't be called with $where == 2.
   774     // So, if asked to display pages for the top of the page, check if we
   775     // have pages to be displayed after the featured story and if there is
   776     // no featured story, display those pages as well.
   777     if (($where == 1) && ($_CONF['showfirstasfeatured'] == 0)) {
   778         if (DB_count ($_TABLES['stories'], 'featured', 1) == 0) {
   779             // no featured story found - redefine $moresql
   780             $moresql = "(sp_where = 1 OR sp_where = 2) AND ";
   781             $displayFeatured = true;
   782         }
   783     }
   784 
   785     if (empty ($topic)) {
   786         $moresql .= "((sp_tid = 'none') OR (sp_tid = 'all'))";
   787     } else {
   788         $moresql .= "((sp_tid = '{$topic}') OR (sp_tid = 'all'))";
   789     }
   790 
   791     if ($_SP_CONF['sort_by'] == 'date') {
   792         $sort = 'sp_date DESC';
   793     } else if ($_SP_CONF['sort_by'] == 'title') {
   794         $sort = 'sp_title';
   795     } else { // default to "sort by id"
   796         $sort = 'sp_id';
   797     }
   798     if ($displayFeatured) {
   799         $sort = 'sp_where,' . $sort;
   800     }
   801 
   802     $perms = SP_getPerms ();
   803     if (!empty ($perms)) {
   804         $perms = ' AND ' . $perms;
   805     }
   806     $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;
   807     $result = DB_query ($spsql);
   808 
   809     $pages = DB_numRows ($result);
   810     if ($pages > 0) {
   811         for ($i = 0; $i < $pages; $i++) {
   812             $S = DB_fetchArray ($result);
   813 
   814             if ($where == 0) {
   815                 switch ($S['sp_format']) {
   816                     case 'noblocks':
   817                         $retval .= COM_siteHeader ('none');
   818                         break;
   819                     case 'allblocks':
   820                     case 'leftblocks':
   821                         $retval .= COM_siteHeader ('menu');
   822                         break;
   823                 }
   824                 if (isset($_GET['msg'])) {
   825                     $msg = COM_applyFilter($_GET['msg'], true);
   826                     if ($msg > 0) {
   827                         $retval .= COM_showMessage($msg);
   828                     }
   829                 }
   830             }
   831 
   832             if (($S['sp_inblock'] == 1) && !empty ($S['sp_title'])
   833                 && (($where != 0) || ($S['sp_format'] != 'blankpage'))) {
   834                 $retval .= COM_startBlock ($S['sp_title'], $S['sp_help'],
   835                     COM_getBlockTemplate ('_staticpages_centerblock', 'header'));
   836             }
   837 
   838             $spage = new Template( $_CONF['path'] . 'plugins/staticpages/templates/' );
   839             $spage->set_file( array('page'=>'centerblock.thtml'));
   840             $spage->set_var('xhtml', XHTML);
   841             $spage->set_var('site_url', $_CONF['site_url']);
   842             $spage->set_var('layout_url', $_CONF['layout_url']);
   843             $spage->set_var('site_admin_url', $_CONF['site_admin_url']);
   844 
   845             if ($_CONF['hideprintericon'] == 0) {
   846                 $icon_url = $_CONF['layout_url'] . '/images/print.' . $_IMAGE_TYPE;
   847                 $attr = array('title' => $LANG_STATIC['printable_format']);
   848                 $printicon = COM_createImage($icon_url, $LANG01[65], $attr);
   849                 $print_url = COM_buildURL ($_CONF['site_url']
   850                     . '/staticpages/index.php?page=' . $S['sp_id'] . '&amp;mode=print');
   851                 $icon = COM_createLink($printicon, $print_url);
   852                 $spage->set_var('print_icon', $icon);
   853             }
   854             if ((SEC_hasAccess ($S['owner_id'], $S['group_id'], $S['perm_owner'],
   855                     $S['perm_group'], $S['perm_members'], $S['perm_anon']) == 3) &&
   856                     SEC_hasRights ('staticpages.edit')) {
   857                 $icon_url = $_CONF['layout_url'] . '/images/edit.' . $_IMAGE_TYPE;
   858                 $attr = array('title' => $LANG_STATIC['edit']);
   859                 $editiconhtml = COM_createImage($icon_url, $LANG_STATIC['edit'], $attr);
   860                 $url = $_CONF['site_admin_url']
   861                     . '/plugins/staticpages/index.php?mode=edit&amp;sp_id=' . $S['sp_id'];
   862                 $attr = array('class' => 'editlink','title' => $LANG_STATIC['edit']);
   863                 $icon =
   864                     '&nbsp;' . COM_createLink(
   865                     $editiconhtml, //display
   866                     $url,  //target
   867                     $attr //other attributes
   868                 );
   869                 $spage->set_var('edit_icon', $icon);
   870             }
   871 
   872             $spage->set_var('info_separator', 'hidden');
   873             if ($_SP_CONF['show_date'] == 1) {
   874                 $curtime = COM_getUserDateTimeFormat($S['sp_date']);
   875                 $lastupdate = $LANG_STATIC['lastupdated']. ' ' . $curtime[0];
   876                 $spage->set_var('lastupdate', $lastupdate);
   877             }
   878 
   879             if ($_SP_CONF['show_hits'] == 1) {
   880                 if ($_SP_CONF['show_date'] == 1) {
   881                     $spage->set_var('info_separator', 'visible');
   882                 }
   883                 $hits = COM_numberFormat($S['sp_hits']) . ' '
   884                                          . $LANG_STATIC['hits'];
   885                 $spage->set_var('hits', $hits);
   886             }
   887 
   888             $content = SP_render_content (stripslashes ($S['sp_content']), $S['sp_php']);
   889             $spage->set_var('content', $content );
   890             $retval .= $spage->finish($spage->parse('output', 'page'));
   891             if (($S['sp_inblock'] == 1) && !empty ($S['sp_title'])
   892                 && (($where != 0) || ($S['sp_format'] != 'blankpage'))) {
   893                 $retval .= COM_endBlock (COM_getBlockTemplate ('_staticpages_centerblock', 'footer'));
   894             }
   895 
   896             if ($where == 0) {
   897                 if ($S['sp_format'] == 'allblocks') {
   898                     $retval .= COM_siteFooter (true);
   899                 } else if ($S['sp_format'] != 'blankpage') {
   900                     $retval .= COM_siteFooter ();
   901                 }
   902             }
   903 
   904             // increment hit counter for page
   905             DB_query ("UPDATE {$_TABLES['staticpage']} SET sp_hits = sp_hits + 1 WHERE sp_id = '{$S['sp_id']}'");
   906         }
   907     }
   908 
   909     return $retval;
   910 }
   911 
   912 /**
   913 * A user is about to be deleted. Update ownership of any static pages owned
   914 * by that user or delete them.
   915 *
   916 * @param   uid   int   User id of deleted user
   917 *
   918 */
   919 function plugin_user_delete_staticpages($uid)
   920 {
   921     global $_TABLES, $_SP_CONF;
   922 
   923     if (DB_count ($_TABLES['staticpage'], 'sp_uid', $uid) +
   924             DB_count ($_TABLES['staticpage'], 'owner_id', $uid) == 0) {
   925         return;
   926     }
   927 
   928     if ($_SP_CONF['delete_pages'] == 1) {
   929         // delete the pages
   930         DB_query ("DELETE FROM {$_TABLES['staticpage']} WHERE (sp_uid = $uid) OR (owner_id = $uid)");
   931     } else {
   932         // assign ownership to a user from the Root group
   933         $rootgroup = DB_getItem ($_TABLES['groups'], 'grp_id',
   934                                  "grp_name = 'Root'");
   935         $result = DB_query ("SELECT DISTINCT ug_uid FROM {$_TABLES['group_assignments']} WHERE ug_main_grp_id = $rootgroup ORDER BY ug_uid LIMIT 1");
   936         $A = DB_fetchArray ($result);
   937         $rootuser = $A['ug_uid'];
   938 
   939         DB_query ("UPDATE {$_TABLES['staticpage']} SET sp_uid = $rootuser WHERE sp_uid = $uid");
   940         DB_query ("UPDATE {$_TABLES['staticpage']} SET owner_id = $rootuser WHERE owner_id = $uid");
   941     }
   942 }
   943 
   944 
   945 /**
   946 * Return the current version of code.
   947 * Used in the Plugin Editor to show the registered version and code version
   948 */
   949 function plugin_chkVersion_staticpages()
   950 {
   951     global $_CONF;
   952 
   953     require_once $_CONF['path'] . 'plugins/staticpages/autoinstall.php';
   954 
   955     $inst_parms = plugin_autoinstall_staticpages('staticpages');
   956 
   957     return $inst_parms['info']['pi_version'];
   958 }
   959 
   960 /**
   961 * Implements the [staticpage:] autotag.
   962 *
   963 */
   964 function plugin_autotags_staticpages($op, $content = '', $autotag = '')
   965 {
   966     global $_CONF, $_TABLES;
   967 
   968     static $recursive = array();
   969 
   970     if ($op == 'tagname' ) {
   971         return array('staticpage', 'staticpage_content');
   972     } else if ($op == 'parse') {
   973         if ($autotag['tag'] == 'staticpage' ) {
   974             $sp_id = COM_applyFilter($autotag['parm1']);
   975             if (! empty($sp_id)) {
   976                 $url = COM_buildUrl($_CONF['site_url']
   977                                 . '/staticpages/index.php?page=' . $sp_id);
   978                 if (empty($autotag['parm2'])) {
   979                     $linktext = stripslashes(DB_getItem($_TABLES['staticpage'],
   980                                              'sp_title', "sp_id = '$sp_id'"));
   981                 } else {
   982                     $linktext = $autotag['parm2'];
   983                 }
   984                 $link = COM_createLink($linktext, $url);
   985                 $content = str_replace($autotag['tagstr'], $link, $content);
   986             }
   987         } else if ($autotag['tag'] == 'staticpage_content') {
   988             $sp_id = COM_applyFilter($autotag['parm1']);
   989             if (! empty($sp_id)) {
   990                 if (isset($recursive[$sp_id])) {
   991                     $content = '';
   992                 } else {
   993                     $recursive[$sp_id] = true;
   994                     $sp_content = SP_returnStaticpage($sp_id, 'autotag');
   995                     $content = str_replace($autotag['tagstr'], $sp_content,
   996                                            $content);
   997                 }
   998             }
   999         }
  1000 
  1001         return $content;
  1002     }
  1003 }
  1004 
  1005 /**
  1006 * Returns the URL of the plugin's icon
  1007 *
  1008 * @return   string      URL of the icon
  1009 *
  1010 */
  1011 function plugin_geticon_staticpages ()
  1012 {
  1013     global $_CONF;
  1014 
  1015     return $_CONF['site_url'] . '/staticpages/images/staticpages.png';
  1016 }
  1017 
  1018 /**
  1019 * Update the Static Pages plugin
  1020 *
  1021 * @return   int     Number of message to display (true = generic success msg)
  1022 *
  1023 */
  1024 function plugin_upgrade_staticpages()
  1025 {
  1026     global $_CONF, $_TABLES, $_DB_dbms;
  1027 
  1028     $installed_version = DB_getItem($_TABLES['plugins'], 'pi_version',
  1029                                     "pi_name = 'staticpages'");
  1030     $code_version = plugin_chkVersion_staticpages();
  1031     if ($installed_version == $code_version) {
  1032         // nothing to do
  1033         return true;
  1034     }
  1035 
  1036     require_once $_CONF['path'] . 'plugins/staticpages/autoinstall.php';
  1037 
  1038     if (! plugin_compatible_with_this_version_staticpages('staticpages')) {
  1039         return 3002;
  1040     }
  1041 
  1042     $inst_parms = plugin_autoinstall_staticpages('staticpages');
  1043     $pi_gl_version = $inst_parms['info']['pi_gl_version'];
  1044 
  1045     require_once $_CONF['path'] . 'plugins/staticpages/sql/'
  1046                                 . $_DB_dbms . '_updates.php';
  1047 
  1048     $current_version = $installed_version;
  1049     $done = false;
  1050     while (! $done) {
  1051         switch ($current_version) {
  1052         case '1.5.1':
  1053             // no db changes
  1054             $current_version = '1.6.0';
  1055             break;
  1056 
  1057         case '1.6.0':
  1058             if (isset($_UPDATES[$current_version])) {
  1059                 $_SQL = $_UPDATES[$current_version];
  1060                 foreach ($_SQL as $sql) {
  1061                     DB_query($sql);
  1062                 }
  1063             }
  1064 
  1065             update_ConfValues_1_6_0();
  1066 
  1067             $current_version = '1.6.1';
  1068             break;
  1069 
  1070         default:
  1071             $done = true;
  1072         }
  1073     }
  1074 
  1075     DB_query("UPDATE {$_TABLES['plugins']} SET pi_version = '$code_version', pi_gl_version = '$pi_gl_version' WHERE pi_name = 'staticpages'");
  1076 
  1077     return true;
  1078 }
  1079 
  1080 /**
  1081 * Called during site migration - handle changed URLs or paths
  1082 *
  1083 * @param    array   $old_conf   contents of the $_CONF array on the old site
  1084 * @param    boolean             true on success, otherwise false
  1085 *
  1086 */
  1087 function plugin_migrate_staticpages($old_conf)
  1088 {
  1089     global $_CONF;
  1090 
  1091     $tables = array(
  1092         'staticpage'    => 'sp_id, sp_content'
  1093     );
  1094 
  1095     if ($old_conf['site_url'] != $_CONF['site_url']) {
  1096         INST_updateSiteUrl($old_conf['site_url'], $_CONF['site_url'], $tables);
  1097     }
  1098 
  1099     return true;
  1100 }
  1101 
  1102 /**
  1103 * Automatic uninstall function for plugins
  1104 *
  1105 * @return   array
  1106 *
  1107 * This code is automatically uninstalling the plugin.
  1108 * It passes an array to the core code function that removes
  1109 * tables, groups, features and php blocks from the tables.
  1110 * Additionally, this code can perform special actions that cannot be
  1111 * foreseen by the core code (interactions with other plugins for example)
  1112 *
  1113 */
  1114 function plugin_autouninstall_staticpages ()
  1115 {
  1116     $out = array (
  1117         /* give the name of the tables, without $_TABLES[] */
  1118         'tables' => array('staticpage'),
  1119         /* give the full name of the group, as in the db */
  1120         'groups' => array('Static Page Admin', // correct Admin group name
  1121                           'Static Pages Admin' // typo in Geeklog 1.6.0
  1122                          ),
  1123         /* give the full name of the feature, as in the db */
  1124         'features' => array('staticpages.edit', 'staticpages.delete', 'staticpages.PHP'),
  1125         /* give the full name of the block, including 'phpblock_', etc */
  1126         'php_blocks' => array('phpblock_calendar'),
  1127         /* give all vars with their name */
  1128         'vars'=> array()
  1129     );
  1130 
  1131     return $out;
  1132 }
  1133 
  1134 /**
  1135 * Get path for the template files.
  1136 *
  1137 * @param    string  $path   subdirectory within the base template path
  1138 * @return   string          full path to template directory
  1139 *
  1140 */
  1141 function staticpages_templatePath ($path = '')
  1142 {
  1143     global $_CONF;
  1144 
  1145     if (empty ($path)) {
  1146         $layout_path = $_CONF['path_layout'] . 'staticpages';
  1147     } else {
  1148         $layout_path = $_CONF['path_layout'] . 'staticpages/' . $path;
  1149     }
  1150 
  1151     if (is_dir ($layout_path)) {
  1152         $retval = $layout_path;
  1153     } else {
  1154         $retval = $_CONF['path'] . 'plugins/staticpages/templates';
  1155         if (!empty ($path)) {
  1156             $retval .= '/' . $path;
  1157         }
  1158     }
  1159 
  1160     return $retval;
  1161 }
  1162 
  1163 function plugin_getListField_staticpages($fieldname, $fieldvalue, $A, $icon_arr)
  1164 {
  1165     global $_CONF, $LANG_ADMIN, $LANG_STATIC, $_TABLES;
  1166 
  1167     switch($fieldname) {
  1168         case "edit":
  1169             $retval = COM_createLink($icon_arr['edit'],
  1170                 "{$_CONF['site_admin_url']}/plugins/staticpages/index.php?mode=edit&amp;sp_id={$A['sp_id']}");
  1171             break;
  1172         case "copy":
  1173             $retval = COM_createLink($icon_arr['copy'],
  1174                 "{$_CONF['site_admin_url']}/plugins/staticpages/index.php?mode=clone&amp;sp_id={$A['sp_id']}");
  1175             break;
  1176         case "sp_title":
  1177             $sp_title = stripslashes ($A['sp_title']);
  1178             $url = COM_buildUrl ($_CONF['site_url'] .
  1179                                  '/staticpages/index.php?page=' . $A['sp_id']);
  1180             $retval = COM_createLink($sp_title, $url, array('title'=>$LANG_STATIC['title_display']));
  1181             break;
  1182         case "sp_uid":
  1183             $retval = COM_getDisplayName ($A['sp_uid']);
  1184             break;
  1185         case "sp_centerblock":
  1186             if ($A['sp_centerblock']) {
  1187                 switch ($A['sp_where']) {
  1188                     case '1': $where = $LANG_STATIC['centerblock_top']; break;
  1189                     case '2': $where = $LANG_STATIC['centerblock_feat']; break;
  1190                     case '3': $where = $LANG_STATIC['centerblock_bottom']; break;
  1191                     default:  $where = $LANG_STATIC['centerblock_entire']; break;
  1192                 }
  1193                 $retval = $where;
  1194             } else {
  1195                 $retval = $LANG_STATIC['centerblock_no'];
  1196             }
  1197             break;
  1198         case "unixdate":
  1199             $retval = strftime ($_CONF['daytime'], $A['unixdate']);
  1200             break;
  1201         default:
  1202             $retval = $fieldvalue;
  1203             break;
  1204     }
  1205     return $retval;
  1206 }
  1207 
  1208 /**
  1209 * Render the actual content of a static page (without any surrounding blocks)
  1210 *
  1211 * @param    string  $sp_content the content (HTML or PHP source)
  1212 * @param    int     $sp_php     flag: 1 = content is PHP source, 0 = is HTML
  1213 * @return   string              rendered content (HTML)
  1214 *
  1215 */
  1216 function SP_render_content ($sp_content, $sp_php)
  1217 {
  1218     global $_SP_CONF, $LANG_STATIC;
  1219 
  1220     $retval = '';
  1221 
  1222     if ($_SP_CONF['allow_php'] == 1) {
  1223         // Check for type (ie html or php)
  1224         if ($sp_php == 1) {
  1225             $retval = eval ($sp_content);
  1226         } else if ($sp_php == 2) {
  1227             ob_start ();
  1228             eval ($sp_content);
  1229             $retval = ob_get_contents ();
  1230             ob_end_clean ();
  1231         } else {
  1232             $retval = $sp_content;
  1233         }
  1234         $retval = PLG_replacetags ($retval);
  1235     } else {
  1236         if ($sp_php != 0) {
  1237             COM_errorLog ("PHP in static pages is disabled. Can not display page '$page'.", 1);
  1238             $retval .= $LANG_STATIC['deny_msg'];
  1239         } else {
  1240             $retval .= PLG_replacetags ($sp_content);
  1241         }
  1242     }
  1243 
  1244     return $retval;
  1245 }
  1246 
  1247 /**
  1248  * Return true since this plugin supports webservices
  1249  *
  1250  * @return  bool	True, if webservices are supported
  1251  */
  1252 function plugin_wsEnabled_staticpages()
  1253 {
  1254     return true;
  1255 }
  1256 
  1257 /**
  1258 * Return headlines for New Static Pages section in the What's New block, if enabled
  1259 *
  1260 * @return   mixed       array(headline, byline), or boolean false if disabled
  1261 *
  1262 */
  1263 function plugin_whatsnewsupported_staticpages()
  1264 {
  1265     global $_SP_CONF, $LANG_STATIC, $LANG_WHATSNEW;
  1266 
  1267     if ($_SP_CONF['hidenewstaticpages'] == 0) {
  1268         $retval = array($LANG_STATIC['pages'],
  1269                         COM_formatTimeString($LANG_WHATSNEW['new_last'],
  1270                                              $_SP_CONF['newstaticpagesinterval'])
  1271                        );
  1272     } else {
  1273         $retval = false;
  1274     }
  1275 
  1276     return $retval;
  1277 }
  1278 
  1279 /**
  1280 * Return new Static Pages for the What's New block
  1281 *
  1282 * @return   string  HTML list of new staticpages
  1283 *
  1284 */
  1285 function plugin_getwhatsnew_staticpages()
  1286 {
  1287     global $_CONF, $_TABLES, $_SP_CONF, $LANG_STATIC;
  1288 
  1289     $retval = '';
  1290 
  1291     $extra_sql = "";
  1292     if ($_SP_CONF['includecenterblocks'] == 0) {
  1293         $extra_sql =' AND sp_centerblock = 0';
  1294     }
  1295     if ($_SP_CONF['includephp'] == 0) {
  1296         $extra_sql .=' AND sp_php = 0';
  1297     }
  1298     
  1299     $sql = "SELECT sp_id, sp_title 
  1300         FROM {$_TABLES['staticpage']} 
  1301         WHERE NOT ISNULL(sp_content) AND (sp_date >= (date_sub(NOW(), INTERVAL {$_SP_CONF['newstaticpagesinterval']} SECOND))) 
  1302         {$extra_sql} 
  1303         " . COM_getPermSQL( 'AND' ) . " 
  1304         ORDER BY sp_date DESC LIMIT 15";
  1305 
  1306     $result = DB_query( $sql );
  1307 
  1308     $nrows = DB_numRows( $result );
  1309 
  1310     if( $nrows > 0)
  1311     {
  1312         $newstaticpages = array();
  1313 
  1314         for( $x = 0; $x < $nrows; $x++ )
  1315         {
  1316             $A = DB_fetchArray( $result );
  1317 
  1318             $url = COM_buildUrl( $_CONF['site_url']
  1319                 . '/staticpages/index.php?page=' . $A['sp_id'] );                
  1320 
  1321             $title = COM_undoSpecialChars( stripslashes( $A['sp_title'] ));
  1322             $titletouse = COM_truncate( $title, $_SP_CONF['title_trim_length'],
  1323                                         '...' );
  1324             if( $title != $titletouse )
  1325             {
  1326                 $attr = array('title' => htmlspecialchars($title));
  1327             }
  1328             else
  1329             {
  1330                 $attr = array();
  1331             }
  1332             $astaticpage = str_replace( '$', '&#36;', $titletouse );
  1333             $astaticpage = str_replace( ' ', '&nbsp;', $astaticpage );
  1334 
  1335             $newstaticpages[] = COM_createLink($astaticpage, $url, $attr);
  1336         }
  1337 
  1338         $retval .= COM_makeList( $newstaticpages, 'list-new-comments' );
  1339     }
  1340     else
  1341     {
  1342         $retval .= $LANG_STATIC['no_new_pages'] . '<br' . XHTML . '>' . LB;
  1343     }
  1344 
  1345     return $retval;
  1346 }
  1347 
  1348 /**
  1349 * Return information for a static page
  1350 *
  1351 * @param    string  $sp_id      static page ID or '*'
  1352 * @param    string  $what       comma-separated list of properties
  1353 * @param    int     $uid        user ID or 0 = current user
  1354 * @param    array   $options    (reserved for future extensions)
  1355 * @return   mixed               string or array of strings with the information
  1356 *
  1357 */
  1358 function plugin_getiteminfo_staticpages($sp_id, $what, $uid = 0, $options = array())
  1359 {
  1360     global $_CONF, $_TABLES;
  1361 
  1362     // parse $what to see what we need to pull from the database
  1363     $properties = explode(',', $what);
  1364     $fields = array();
  1365     foreach ($properties as $p) {
  1366         switch ($p) {
  1367         case 'date-modified':
  1368             $fields[] = 'UNIX_TIMESTAMP(sp_date) AS unixdate';
  1369             break;
  1370         case 'description':
  1371         case 'excerpt':
  1372             $fields[] = 'sp_content';
  1373             $fields[] = 'sp_php';
  1374             break;
  1375         case 'id':
  1376             $fields[] = 'sp_id';
  1377             break;
  1378         case 'title':
  1379             $fields[] = 'sp_title';
  1380             break;
  1381         case 'url':
  1382             // needed for $sp_id == '*', but also in case we're only requesting
  1383             // the URL (so that $fields isn't emtpy)
  1384             $fields[] = 'sp_id';
  1385             break;
  1386         default:
  1387             // nothing to do
  1388             break;
  1389         }
  1390     }
  1391 
  1392     $fields = array_unique($fields);
  1393 
  1394     if (count($fields) == 0) {
  1395         $retval = array();
  1396 
  1397         return $retval;
  1398     }
  1399 
  1400     // prepare SQL request
  1401     if ($sp_id == '*') {
  1402         $where = '';
  1403         $permOp = 'WHERE';
  1404     } else {
  1405         $where = " WHERE sp_id = '" . addslashes($sp_id) . "'";
  1406         $permOp = 'AND';
  1407     }
  1408     if ($uid > 0) {
  1409         $permSql = COM_getPermSql($permOp, $uid);
  1410     } else {
  1411         $permSql = COM_getPermSql($permOp);
  1412     }
  1413     $sql = "SELECT " . implode(',', $fields)
  1414             . " FROM {$_TABLES['staticpage']}" . $where . $permSql;
  1415     if ($sp_id != '*') {
  1416         $sql .= ' LIMIT 1';
  1417     }
  1418 
  1419     $result = DB_query($sql);
  1420     $numRows = DB_numRows($result);
  1421 
  1422     $retval = array();
  1423     for ($i = 0; $i < $numRows; $i++) {
  1424         $A = DB_fetchArray($result);
  1425 
  1426         $props = array();
  1427         foreach ($properties as $p) {
  1428             switch ($p) {
  1429             case 'date-modified':
  1430                 $props['date-modified'] = $A['unixdate'];
  1431                 break;
  1432             case 'description':
  1433             case 'excerpt':
  1434                 $props[$p] = SP_render_content(stripslashes($A['sp_content']),
  1435                                                             $A['sp_php']);
  1436                 break;
  1437             case 'id':
  1438                 $props['id'] = $A['sp_id'];
  1439                 break;
  1440             case 'title':
  1441                 $props['title'] = stripslashes($A['sp_title']);
  1442                 break;
  1443             case 'url':
  1444                 if (empty($A['sp_id'])) {
  1445                     $props['url'] = COM_buildUrl($_CONF['site_url']
  1446                             . '/staticpages/index.php?page=' . $sp_id);
  1447                 } else {
  1448                     $props['url'] = COM_buildUrl($_CONF['site_url']
  1449                             . '/staticpages/index.php?page=' . $A['sp_id']);
  1450                 }
  1451                 break;
  1452             default:
  1453                 // return empty string for unknown properties
  1454                 $props[$p] = '';
  1455                 break;
  1456             }
  1457         }
  1458 
  1459         $mapped = array();
  1460         foreach ($props as $key => $value) {
  1461             if ($sp_id == '*') {
  1462                 if ($value != '') {
  1463                     $mapped[$key] = $value;
  1464                 }
  1465             } else {
  1466                 $mapped[] = $value;
  1467             }
  1468         }
  1469 
  1470         if ($sp_id == '*') {
  1471             $retval[] = $mapped;
  1472         } else {
  1473             $retval = $mapped;
  1474             break;
  1475         }
  1476     }
  1477 
  1478     if (($sp_id != '*') && (count($retval) == 1)) {
  1479         $retval = $retval[0];
  1480     }
  1481 
  1482     return $retval;
  1483 }
  1484 
  1485 /**
  1486 * Provide URL of a documentation file
  1487 *
  1488 * @param    string  $file   documentation file being requested, e.g. 'config'
  1489 * @return   mixed           URL or false when not available
  1490 *
  1491 */
  1492 function plugin_getdocumentationurl_staticpages($file)
  1493 {
  1494     global $_CONF;
  1495 
  1496     static $docurl;
  1497 
  1498     switch ($file) {
  1499     case 'index':
  1500     case 'config':
  1501         if (isset($docurl)) {
  1502             $retval = $docurl;
  1503         } else {
  1504             $doclang = COM_getLanguageName();
  1505             $docs = 'docs/' . $doclang . '/staticpages.html';
  1506             if (file_exists($_CONF['path_html'] . $docs)) {
  1507                 $retval = $_CONF['site_url'] . '/' . $docs;
  1508             } else {
  1509                 $retval = $_CONF['site_url'] . '/docs/english/staticpages.html';
  1510             }
  1511             $docurl = $retval;
  1512         }
  1513         break;
  1514 
  1515     default:
  1516         $retval = false;
  1517         break;
  1518     }
  1519 
  1520     return $retval;
  1521 }
  1522 
  1523 /**
  1524 * Provide URL and ID for the link to a comment's parent
  1525 *
  1526 * NOTE: The Plugin API does not support $_CONF['url_rewrite'] here,
  1527 *       so we'll end up with a non-rewritten URL ...
  1528 *
  1529 * @return   array   array consisting of the base URL and the ID name
  1530 *
  1531 */
  1532 function plugin_getcommenturlid_staticpages()
  1533 {
  1534     global $_CONF;
  1535 
  1536     $tmp = array(
  1537         $_CONF['site_url'] . '/staticpages/index.php',
  1538         'page'
  1539     );
  1540 
  1541     return $tmp;
  1542 }
  1543 
  1544 ?>