plugins/staticpages/functions.inc
author Dirk Haun <dirk@haun-online.de>
Tue, 03 Nov 2009 21:53:52 +0100
branchHEAD
changeset 7436 dcad55dde562
parent 7403 7a15ec67da80
child 7467 dc00de754aba
permissions -rw-r--r--
Wrong CSS class (fix by Tom Homer)
     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, $_SP_CONF;
   604 
   605     if ($_SP_CONF['includesearch'] != 1) {
   606         return;
   607     }
   608 
   609     // Make sure the query is SQL safe
   610     $query = trim(addslashes($query));
   611 
   612     $sql = "SELECT sp.sp_id AS id, sp.sp_title AS title, sp.sp_content AS description, ";
   613     $sql .= "UNIX_TIMESTAMP(sp.sp_date) AS date, sp.sp_uid AS uid, sp.sp_hits AS hits, ";
   614     $sql .= "CONCAT('/staticpages/index.php?page=', sp.sp_id) AS url ";
   615     $sql .= "FROM {$_TABLES['staticpage']} AS sp,{$_TABLES['users']} AS u ";
   616     $sql .= "WHERE (sp.sp_uid = u.uid) AND (sp_php <> 1) ";
   617     $sql .= COM_getPermSQL('AND') . COM_getLangSQL('sp_id', 'AND', 'sp') . ' ';
   618 
   619     if (!empty ($author)) {
   620         $sql .= "AND (sp_uid = '$author') ";
   621     }
   622 
   623     $search_p = new SearchCriteria('staticpages', $LANG_STATIC['staticpages']);
   624 
   625     $columns = array('title' => 'sp_title', 'sp_content');
   626     $sql .= $search_p->getDateRangeSQL('AND', 'sp_date', $datestart, $dateend);
   627     list($sql,$ftsql) = $search_p->buildSearchSQL($keyType, $query, $columns, $sql);
   628 
   629     $search_p->setSQL($sql);
   630     $search_p->setFTSQL($ftsql);
   631     $search_p->setRank(3);
   632     $search_p->setURLRewrite(true);
   633 
   634     // Search static page comments
   635     $sql = "SELECT c.cid AS id, c.title AS title, c.comment AS description, ";
   636     $sql .= "UNIX_TIMESTAMP(c.date) AS date, c.uid AS uid, ";
   637 
   638     // MSSQL has a problem when concatenating numeric values
   639     if ($_DB_dbms == 'mssql') {
   640         $sql .= "'/comment.php?mode=view&amp;cid=' + CAST(c.cid AS varchar(10)) AS url ";
   641     } else {
   642         $sql .= "CONCAT('/comment.php?mode=view&amp;cid=',c.cid) AS url ";
   643     }
   644 
   645     $sql .= "FROM {$_TABLES['users']} AS u, {$_TABLES['comments']} AS c ";
   646     $sql .= "LEFT JOIN {$_TABLES['staticpage']} AS s ON ((s.sp_id = c.sid) ";
   647     $sql .= COM_getPermSQL('AND',0,2,'s') . COM_getLangSQL('sid','AND','s') . ") ";
   648     $sql .= "WHERE (u.uid = c.uid) AND (s.commentcode >= 0) AND (s.sp_date <= NOW()) ";
   649 
   650     if (!empty($author)) {
   651         $sql .= "AND (c.uid = '$author') ";
   652     }
   653 
   654     $search_c = new SearchCriteria('comments', array($LANG_STATIC['staticpages'],$LANG09[66]));
   655 
   656     $columns = array('title' => 'c.title', 'comment');
   657     $sql .= $search_c->getDateRangeSQL('AND', 'c_date', $datestart, $dateend);
   658     list($sql, $ftsql) = $search_c->buildSearchSQL($keyType, $query, $columns, $sql);
   659 
   660     $search_c->setSQL($sql);
   661     $search_c->setFTSQL($ftsql);
   662     $search_c->setRank(2);
   663 
   664     return array($search_p, $search_c);
   665 }
   666 
   667 
   668 /**
   669 * This will put an option for static pages in the command and control block on
   670 * moderation.php
   671 *
   672 */
   673 function plugin_cclabel_staticpages()
   674 {
   675     global $LANG_STATIC, $_CONF;
   676 
   677     if (SEC_hasRights ('staticpages.edit,staticpages.delete', 'OR')) {
   678         return array ($LANG_STATIC['staticpages'],
   679                 $_CONF['site_admin_url'] . '/plugins/staticpages/index.php',
   680                 plugin_geticon_staticpages ());
   681     }
   682 
   683     return false;
   684 }
   685 
   686 /**
   687 * returns the administrative option for this plugin
   688 *
   689 */
   690 function plugin_getadminoption_staticpages()
   691 {
   692     global $_CONF, $_TABLES, $LANG_STATIC;
   693 
   694     if (SEC_hasRights ('staticpages.edit,staticpages.delete', 'OR')) {
   695         $result = DB_query ("SELECT COUNT(*) AS cnt FROM {$_TABLES['staticpage']}" . COM_getPermSQL ('WHERE', 0, 3));
   696         $A = DB_fetchArray ($result);
   697         $total_pages = $A['cnt'];
   698         return array ($LANG_STATIC['staticpages'], $_CONF['site_admin_url'] . '/plugins/staticpages/index.php', $total_pages);
   699     }
   700 }
   701 
   702 /**
   703 * Return SQL where statement with appropriate permissions
   704 *
   705 * Takes User id and permission and returns SQL where clause which will return
   706 * the appropriate objects.
   707 * This assumes that the table has the following security structure:
   708 * owner_id        | mediumint(8)
   709 * group_id        | mediumint(8)
   710 * perm_owner      | tinyint(1) unsigned
   711 * perm_group      | tinyint(1) unsigned
   712 * perm_members    | tinyint(1) unsigned
   713 * perm_anon       | tinyint(1) unsigned
   714 * This will work with the standard GL tables
   715 *
   716 * @param    string  $table  Table name (used in joins)
   717 * @param    int     $access Access if blank read access  2 = read 3 = read/edit
   718 * @param    int     $u_id   User ID if blank current user
   719 * @return   string          Where clause of sql statement
   720 *
   721 */
   722 function SP_getPerms ($table = '', $access = '2', $u_id = '')
   723 {
   724     global $_USER, $_GROUPS;
   725 
   726     if ($table != '') { $table .= '.'; }
   727 
   728     if ($u_id == '') {
   729         if (isset ($_USER['uid'])) {
   730             $uid = $_USER['uid'];
   731         } else {
   732             $uid = 1;
   733         }
   734         $GROUPS = $_GROUPS;
   735     } else {
   736         $uid = $u_id;
   737         $GROUPS = SEC_getUserGroups ($uid);
   738     }
   739 
   740     $sql = '(';
   741 
   742     if ($uid > 1) {
   743         $sql .= "((owner_id = '{$uid}') AND (perm_owner >= $access)) OR ";
   744 
   745         $sql .= "((group_id IN (" . implode (',', $GROUPS) . ")) "
   746              . "AND (perm_group >= $access)) OR (perm_members >= $access)";
   747     } else {
   748         $sql .= "perm_anon >= $access";
   749     }
   750 
   751     $sql .= ')';
   752 
   753     return $sql;
   754 }
   755 
   756 /**
   757 * Display static pages in the center block.
   758 *
   759 * @param   where   int      where the static page will be displayed (0..3)
   760 * @param   page    int      page number
   761 * @param   topic   string   topic ID
   762 * @return          string   HTML for the static page (can be empty)
   763 */
   764 function plugin_centerblock_staticpages ($where = 1, $page = 1, $topic ='')
   765 {
   766     global $_CONF, $_TABLES, $_SP_CONF, $LANG_STATIC, $_IMAGE_TYPE, $LANG01;
   767 
   768     $retval = '';
   769 
   770     if ($page > 1) {
   771         return $retval; // we only support page 1 at the moment ...
   772     }
   773 
   774     $moresql = "(sp_where = $where) AND ";
   775     $displayFeatured = false;
   776 
   777     // If there are no featured stories, we won't be called with $where == 2.
   778     // So, if asked to display pages for the top of the page, check if we
   779     // have pages to be displayed after the featured story and if there is
   780     // no featured story, display those pages as well.
   781     if (($where == 1) && ($_CONF['showfirstasfeatured'] == 0)) {
   782         if (DB_count ($_TABLES['stories'], 'featured', 1) == 0) {
   783             // no featured story found - redefine $moresql
   784             $moresql = "(sp_where = 1 OR sp_where = 2) AND ";
   785             $displayFeatured = true;
   786         }
   787     }
   788 
   789     if (empty ($topic)) {
   790         $moresql .= "((sp_tid = 'none') OR (sp_tid = 'all'))";
   791     } else {
   792         $moresql .= "((sp_tid = '{$topic}') OR (sp_tid = 'all'))";
   793     }
   794 
   795     if ($_SP_CONF['sort_by'] == 'date') {
   796         $sort = 'sp_date DESC';
   797     } else if ($_SP_CONF['sort_by'] == 'title') {
   798         $sort = 'sp_title';
   799     } else { // default to "sort by id"
   800         $sort = 'sp_id';
   801     }
   802     if ($displayFeatured) {
   803         $sort = 'sp_where,' . $sort;
   804     }
   805 
   806     $perms = SP_getPerms ();
   807     if (!empty ($perms)) {
   808         $perms = ' AND ' . $perms;
   809     }
   810     $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;
   811     $result = DB_query ($spsql);
   812 
   813     $pages = DB_numRows ($result);
   814     if ($pages > 0) {
   815         for ($i = 0; $i < $pages; $i++) {
   816             $S = DB_fetchArray ($result);
   817 
   818             if ($where == 0) {
   819                 switch ($S['sp_format']) {
   820                     case 'noblocks':
   821                         $retval .= COM_siteHeader ('none');
   822                         break;
   823                     case 'allblocks':
   824                     case 'leftblocks':
   825                         $retval .= COM_siteHeader ('menu');
   826                         break;
   827                 }
   828                 if (isset($_GET['msg'])) {
   829                     $msg = COM_applyFilter($_GET['msg'], true);
   830                     if ($msg > 0) {
   831                         $retval .= COM_showMessage($msg);
   832                     }
   833                 }
   834             }
   835 
   836             if (($S['sp_inblock'] == 1) && !empty ($S['sp_title'])
   837                 && (($where != 0) || ($S['sp_format'] != 'blankpage'))) {
   838                 $retval .= COM_startBlock ($S['sp_title'], $S['sp_help'],
   839                     COM_getBlockTemplate ('_staticpages_centerblock', 'header'));
   840             }
   841 
   842             $spage = new Template( $_CONF['path'] . 'plugins/staticpages/templates/' );
   843             $spage->set_file( array('page'=>'centerblock.thtml'));
   844             $spage->set_var('xhtml', XHTML);
   845             $spage->set_var('site_url', $_CONF['site_url']);
   846             $spage->set_var('layout_url', $_CONF['layout_url']);
   847             $spage->set_var('site_admin_url', $_CONF['site_admin_url']);
   848 
   849             if ($_CONF['hideprintericon'] == 0) {
   850                 $icon_url = $_CONF['layout_url'] . '/images/print.' . $_IMAGE_TYPE;
   851                 $attr = array('title' => $LANG_STATIC['printable_format']);
   852                 $printicon = COM_createImage($icon_url, $LANG01[65], $attr);
   853                 $print_url = COM_buildURL ($_CONF['site_url']
   854                     . '/staticpages/index.php?page=' . $S['sp_id'] . '&amp;mode=print');
   855                 $icon = COM_createLink($printicon, $print_url);
   856                 $spage->set_var('print_icon', $icon);
   857             }
   858             if ((SEC_hasAccess ($S['owner_id'], $S['group_id'], $S['perm_owner'],
   859                     $S['perm_group'], $S['perm_members'], $S['perm_anon']) == 3) &&
   860                     SEC_hasRights ('staticpages.edit')) {
   861                 $icon_url = $_CONF['layout_url'] . '/images/edit.' . $_IMAGE_TYPE;
   862                 $attr = array('title' => $LANG_STATIC['edit']);
   863                 $editiconhtml = COM_createImage($icon_url, $LANG_STATIC['edit'], $attr);
   864                 $url = $_CONF['site_admin_url']
   865                     . '/plugins/staticpages/index.php?mode=edit&amp;sp_id=' . $S['sp_id'];
   866                 $attr = array('class' => 'editlink','title' => $LANG_STATIC['edit']);
   867                 $icon =
   868                     '&nbsp;' . COM_createLink(
   869                     $editiconhtml, //display
   870                     $url,  //target
   871                     $attr //other attributes
   872                 );
   873                 $spage->set_var('edit_icon', $icon);
   874             }
   875 
   876             $spage->set_var('info_separator', 'hidden');
   877             if ($_SP_CONF['show_date'] == 1) {
   878                 $curtime = COM_getUserDateTimeFormat($S['sp_date']);
   879                 $lastupdate = $LANG_STATIC['lastupdated']. ' ' . $curtime[0];
   880                 $spage->set_var('lastupdate', $lastupdate);
   881             }
   882 
   883             if ($_SP_CONF['show_hits'] == 1) {
   884                 if ($_SP_CONF['show_date'] == 1) {
   885                     $spage->set_var('info_separator', 'visible');
   886                 }
   887                 $hits = COM_numberFormat($S['sp_hits']) . ' '
   888                                          . $LANG_STATIC['hits'];
   889                 $spage->set_var('hits', $hits);
   890             }
   891 
   892             $content = SP_render_content (stripslashes ($S['sp_content']), $S['sp_php']);
   893             $spage->set_var('content', $content );
   894             $retval .= $spage->finish($spage->parse('output', 'page'));
   895             if (($S['sp_inblock'] == 1) && !empty ($S['sp_title'])
   896                 && (($where != 0) || ($S['sp_format'] != 'blankpage'))) {
   897                 $retval .= COM_endBlock (COM_getBlockTemplate ('_staticpages_centerblock', 'footer'));
   898             }
   899 
   900             if ($where == 0) {
   901                 if ($S['sp_format'] == 'allblocks') {
   902                     $retval .= COM_siteFooter (true);
   903                 } else if ($S['sp_format'] != 'blankpage') {
   904                     $retval .= COM_siteFooter ();
   905                 }
   906             }
   907 
   908             // increment hit counter for page
   909             DB_query ("UPDATE {$_TABLES['staticpage']} SET sp_hits = sp_hits + 1 WHERE sp_id = '{$S['sp_id']}'");
   910         }
   911     }
   912 
   913     return $retval;
   914 }
   915 
   916 /**
   917 * A user is about to be deleted. Update ownership of any static pages owned
   918 * by that user or delete them.
   919 *
   920 * @param   uid   int   User id of deleted user
   921 *
   922 */
   923 function plugin_user_delete_staticpages($uid)
   924 {
   925     global $_TABLES, $_SP_CONF;
   926 
   927     if (DB_count ($_TABLES['staticpage'], 'sp_uid', $uid) +
   928             DB_count ($_TABLES['staticpage'], 'owner_id', $uid) == 0) {
   929         return;
   930     }
   931 
   932     if ($_SP_CONF['delete_pages'] == 1) {
   933         // delete the pages
   934         DB_query ("DELETE FROM {$_TABLES['staticpage']} WHERE (sp_uid = $uid) OR (owner_id = $uid)");
   935     } else {
   936         // assign ownership to a user from the Root group
   937         $rootgroup = DB_getItem ($_TABLES['groups'], 'grp_id',
   938                                  "grp_name = 'Root'");
   939         $result = DB_query ("SELECT DISTINCT ug_uid FROM {$_TABLES['group_assignments']} WHERE ug_main_grp_id = $rootgroup ORDER BY ug_uid LIMIT 1");
   940         $A = DB_fetchArray ($result);
   941         $rootuser = $A['ug_uid'];
   942 
   943         DB_query ("UPDATE {$_TABLES['staticpage']} SET sp_uid = $rootuser WHERE sp_uid = $uid");
   944         DB_query ("UPDATE {$_TABLES['staticpage']} SET owner_id = $rootuser WHERE owner_id = $uid");
   945     }
   946 }
   947 
   948 
   949 /**
   950 * Return the current version of code.
   951 * Used in the Plugin Editor to show the registered version and code version
   952 */
   953 function plugin_chkVersion_staticpages()
   954 {
   955     global $_CONF;
   956 
   957     require_once $_CONF['path'] . 'plugins/staticpages/autoinstall.php';
   958 
   959     $inst_parms = plugin_autoinstall_staticpages('staticpages');
   960 
   961     return $inst_parms['info']['pi_version'];
   962 }
   963 
   964 /**
   965 * Implements the [staticpage:] autotag.
   966 *
   967 */
   968 function plugin_autotags_staticpages($op, $content = '', $autotag = '')
   969 {
   970     global $_CONF, $_TABLES;
   971 
   972     static $recursive = array();
   973 
   974     if ($op == 'tagname' ) {
   975         return array('staticpage', 'staticpage_content');
   976     } else if ($op == 'parse') {
   977         if ($autotag['tag'] == 'staticpage' ) {
   978             $sp_id = COM_applyFilter($autotag['parm1']);
   979             if (! empty($sp_id)) {
   980                 $url = COM_buildUrl($_CONF['site_url']
   981                                 . '/staticpages/index.php?page=' . $sp_id);
   982                 if (empty($autotag['parm2'])) {
   983                     $linktext = stripslashes(DB_getItem($_TABLES['staticpage'],
   984                                              'sp_title', "sp_id = '$sp_id'"));
   985                 } else {
   986                     $linktext = $autotag['parm2'];
   987                 }
   988                 $link = COM_createLink($linktext, $url);
   989                 $content = str_replace($autotag['tagstr'], $link, $content);
   990             }
   991         } else if ($autotag['tag'] == 'staticpage_content') {
   992             $sp_id = COM_applyFilter($autotag['parm1']);
   993             if (! empty($sp_id)) {
   994                 if (isset($recursive[$sp_id])) {
   995                     $content = '';
   996                 } else {
   997                     $recursive[$sp_id] = true;
   998                     $sp_content = SP_returnStaticpage($sp_id, 'autotag');
   999                     $content = str_replace($autotag['tagstr'], $sp_content,
  1000                                            $content);
  1001                 }
  1002             }
  1003         }
  1004 
  1005         return $content;
  1006     }
  1007 }
  1008 
  1009 /**
  1010 * Returns the URL of the plugin's icon
  1011 *
  1012 * @return   string      URL of the icon
  1013 *
  1014 */
  1015 function plugin_geticon_staticpages ()
  1016 {
  1017     global $_CONF;
  1018 
  1019     return $_CONF['site_url'] . '/staticpages/images/staticpages.png';
  1020 }
  1021 
  1022 /**
  1023 * Update the Static Pages plugin
  1024 *
  1025 * @return   int     Number of message to display (true = generic success msg)
  1026 *
  1027 */
  1028 function plugin_upgrade_staticpages()
  1029 {
  1030     global $_CONF, $_TABLES, $_DB_dbms;
  1031 
  1032     $installed_version = DB_getItem($_TABLES['plugins'], 'pi_version',
  1033                                     "pi_name = 'staticpages'");
  1034     $code_version = plugin_chkVersion_staticpages();
  1035     if ($installed_version == $code_version) {
  1036         // nothing to do
  1037         return true;
  1038     }
  1039 
  1040     require_once $_CONF['path'] . 'plugins/staticpages/autoinstall.php';
  1041 
  1042     if (! plugin_compatible_with_this_version_staticpages('staticpages')) {
  1043         return 3002;
  1044     }
  1045 
  1046     $inst_parms = plugin_autoinstall_staticpages('staticpages');
  1047     $pi_gl_version = $inst_parms['info']['pi_gl_version'];
  1048 
  1049     require_once $_CONF['path'] . 'plugins/staticpages/sql/'
  1050                                 . $_DB_dbms . '_updates.php';
  1051 
  1052     $current_version = $installed_version;
  1053     $done = false;
  1054     while (! $done) {
  1055         switch ($current_version) {
  1056         case '1.5.1':
  1057             // no db changes
  1058             $current_version = '1.6.0';
  1059             break;
  1060 
  1061         case '1.6.0':
  1062             if (isset($_UPDATES[$current_version])) {
  1063                 $_SQL = $_UPDATES[$current_version];
  1064                 foreach ($_SQL as $sql) {
  1065                     DB_query($sql);
  1066                 }
  1067             }
  1068 
  1069             update_ConfValues_1_6_0();
  1070 
  1071             $current_version = '1.6.1';
  1072             break;
  1073 
  1074         default:
  1075             $done = true;
  1076         }
  1077     }
  1078 
  1079     DB_query("UPDATE {$_TABLES['plugins']} SET pi_version = '$code_version', pi_gl_version = '$pi_gl_version' WHERE pi_name = 'staticpages'");
  1080 
  1081     return true;
  1082 }
  1083 
  1084 /**
  1085 * Called during site migration - handle changed URLs or paths
  1086 *
  1087 * @param    array   $old_conf   contents of the $_CONF array on the old site
  1088 * @param    boolean             true on success, otherwise false
  1089 *
  1090 */
  1091 function plugin_migrate_staticpages($old_conf)
  1092 {
  1093     global $_CONF;
  1094 
  1095     $tables = array(
  1096         'staticpage'    => 'sp_id, sp_content'
  1097     );
  1098 
  1099     if ($old_conf['site_url'] != $_CONF['site_url']) {
  1100         INST_updateSiteUrl($old_conf['site_url'], $_CONF['site_url'], $tables);
  1101     }
  1102 
  1103     return true;
  1104 }
  1105 
  1106 /**
  1107 * Automatic uninstall function for plugins
  1108 *
  1109 * @return   array
  1110 *
  1111 * This code is automatically uninstalling the plugin.
  1112 * It passes an array to the core code function that removes
  1113 * tables, groups, features and php blocks from the tables.
  1114 * Additionally, this code can perform special actions that cannot be
  1115 * foreseen by the core code (interactions with other plugins for example)
  1116 *
  1117 */
  1118 function plugin_autouninstall_staticpages ()
  1119 {
  1120     $out = array (
  1121         /* give the name of the tables, without $_TABLES[] */
  1122         'tables' => array('staticpage'),
  1123         /* give the full name of the group, as in the db */
  1124         'groups' => array('Static Page Admin', // correct Admin group name
  1125                           'Static Pages Admin' // typo in Geeklog 1.6.0
  1126                          ),
  1127         /* give the full name of the feature, as in the db */
  1128         'features' => array('staticpages.edit', 'staticpages.delete', 'staticpages.PHP'),
  1129         /* give the full name of the block, including 'phpblock_', etc */
  1130         'php_blocks' => array('phpblock_calendar'),
  1131         /* give all vars with their name */
  1132         'vars'=> array()
  1133     );
  1134 
  1135     return $out;
  1136 }
  1137 
  1138 /**
  1139 * Get path for the template files.
  1140 *
  1141 * @param    string  $path   subdirectory within the base template path
  1142 * @return   string          full path to template directory
  1143 *
  1144 */
  1145 function staticpages_templatePath ($path = '')
  1146 {
  1147     global $_CONF;
  1148 
  1149     if (empty ($path)) {
  1150         $layout_path = $_CONF['path_layout'] . 'staticpages';
  1151     } else {
  1152         $layout_path = $_CONF['path_layout'] . 'staticpages/' . $path;
  1153     }
  1154 
  1155     if (is_dir ($layout_path)) {
  1156         $retval = $layout_path;
  1157     } else {
  1158         $retval = $_CONF['path'] . 'plugins/staticpages/templates';
  1159         if (!empty ($path)) {
  1160             $retval .= '/' . $path;
  1161         }
  1162     }
  1163 
  1164     return $retval;
  1165 }
  1166 
  1167 function plugin_getListField_staticpages($fieldname, $fieldvalue, $A, $icon_arr)
  1168 {
  1169     global $_CONF, $LANG_ADMIN, $LANG_STATIC, $_TABLES;
  1170 
  1171     switch($fieldname) {
  1172         case "edit":
  1173             $retval = COM_createLink($icon_arr['edit'],
  1174                 "{$_CONF['site_admin_url']}/plugins/staticpages/index.php?mode=edit&amp;sp_id={$A['sp_id']}");
  1175             break;
  1176         case "copy":
  1177             $retval = COM_createLink($icon_arr['copy'],
  1178                 "{$_CONF['site_admin_url']}/plugins/staticpages/index.php?mode=clone&amp;sp_id={$A['sp_id']}");
  1179             break;
  1180         case "sp_title":
  1181             $sp_title = stripslashes ($A['sp_title']);
  1182             $url = COM_buildUrl ($_CONF['site_url'] .
  1183                                  '/staticpages/index.php?page=' . $A['sp_id']);
  1184             $retval = COM_createLink($sp_title, $url, array('title'=>$LANG_STATIC['title_display']));
  1185             break;
  1186         case "sp_uid":
  1187             $retval = COM_getDisplayName ($A['sp_uid']);
  1188             break;
  1189         case "sp_centerblock":
  1190             if ($A['sp_centerblock']) {
  1191                 switch ($A['sp_where']) {
  1192                     case '1': $where = $LANG_STATIC['centerblock_top']; break;
  1193                     case '2': $where = $LANG_STATIC['centerblock_feat']; break;
  1194                     case '3': $where = $LANG_STATIC['centerblock_bottom']; break;
  1195                     default:  $where = $LANG_STATIC['centerblock_entire']; break;
  1196                 }
  1197                 $retval = $where;
  1198             } else {
  1199                 $retval = $LANG_STATIC['centerblock_no'];
  1200             }
  1201             break;
  1202         case "unixdate":
  1203             $retval = strftime ($_CONF['daytime'], $A['unixdate']);
  1204             break;
  1205         default:
  1206             $retval = $fieldvalue;
  1207             break;
  1208     }
  1209     return $retval;
  1210 }
  1211 
  1212 /**
  1213 * Render the actual content of a static page (without any surrounding blocks)
  1214 *
  1215 * @param    string  $sp_content the content (HTML or PHP source)
  1216 * @param    int     $sp_php     flag: 1 = content is PHP source, 0 = is HTML
  1217 * @return   string              rendered content (HTML)
  1218 *
  1219 */
  1220 function SP_render_content ($sp_content, $sp_php)
  1221 {
  1222     global $_SP_CONF, $LANG_STATIC;
  1223 
  1224     $retval = '';
  1225 
  1226     if ($_SP_CONF['allow_php'] == 1) {
  1227         // Check for type (ie html or php)
  1228         if ($sp_php == 1) {
  1229             $retval = eval ($sp_content);
  1230         } else if ($sp_php == 2) {
  1231             ob_start ();
  1232             eval ($sp_content);
  1233             $retval = ob_get_contents ();
  1234             ob_end_clean ();
  1235         } else {
  1236             $retval = $sp_content;
  1237         }
  1238         $retval = PLG_replacetags ($retval);
  1239     } else {
  1240         if ($sp_php != 0) {
  1241             COM_errorLog ("PHP in static pages is disabled. Can not display page '$page'.", 1);
  1242             $retval .= $LANG_STATIC['deny_msg'];
  1243         } else {
  1244             $retval .= PLG_replacetags ($sp_content);
  1245         }
  1246     }
  1247 
  1248     return $retval;
  1249 }
  1250 
  1251 /**
  1252  * Return true since this plugin supports webservices
  1253  *
  1254  * @return  bool	True, if webservices are supported
  1255  */
  1256 function plugin_wsEnabled_staticpages()
  1257 {
  1258     return true;
  1259 }
  1260 
  1261 /**
  1262 * Return headlines for New Static Pages section in the What's New block, if enabled
  1263 *
  1264 * @return   mixed       array(headline, byline), or boolean false if disabled
  1265 *
  1266 */
  1267 function plugin_whatsnewsupported_staticpages()
  1268 {
  1269     global $_SP_CONF, $LANG_STATIC, $LANG_WHATSNEW;
  1270 
  1271     if ($_SP_CONF['hidenewstaticpages'] == 0) {
  1272         $retval = array($LANG_STATIC['pages'],
  1273                         COM_formatTimeString($LANG_WHATSNEW['new_last'],
  1274                                              $_SP_CONF['newstaticpagesinterval'])
  1275                        );
  1276     } else {
  1277         $retval = false;
  1278     }
  1279 
  1280     return $retval;
  1281 }
  1282 
  1283 /**
  1284 * Return new Static Pages for the What's New block
  1285 *
  1286 * @return   string  HTML list of new staticpages
  1287 *
  1288 */
  1289 function plugin_getwhatsnew_staticpages()
  1290 {
  1291     global $_CONF, $_TABLES, $_SP_CONF, $LANG_STATIC;
  1292 
  1293     $retval = '';
  1294 
  1295     $extra_sql = "";
  1296     if ($_SP_CONF['includecenterblocks'] == 0) {
  1297         $extra_sql =' AND sp_centerblock = 0';
  1298     }
  1299     if ($_SP_CONF['includephp'] == 0) {
  1300         $extra_sql .=' AND sp_php = 0';
  1301     }
  1302     
  1303     $sql = "SELECT sp_id, sp_title 
  1304         FROM {$_TABLES['staticpage']} 
  1305         WHERE NOT ISNULL(sp_content) AND (sp_date >= (DATE_SUB(NOW(), INTERVAL {$_SP_CONF['newstaticpagesinterval']} SECOND))) 
  1306         {$extra_sql} 
  1307         " . COM_getPermSQL( 'AND' ) . " 
  1308         ORDER BY sp_date DESC LIMIT 15";
  1309 
  1310     $result = DB_query( $sql );
  1311 
  1312     $nrows = DB_numRows( $result );
  1313 
  1314     if( $nrows > 0)
  1315     {
  1316         $newstaticpages = array();
  1317 
  1318         for( $x = 0; $x < $nrows; $x++ )
  1319         {
  1320             $A = DB_fetchArray( $result );
  1321 
  1322             $url = COM_buildUrl( $_CONF['site_url']
  1323                 . '/staticpages/index.php?page=' . $A['sp_id'] );                
  1324 
  1325             $title = COM_undoSpecialChars( stripslashes( $A['sp_title'] ));
  1326             $titletouse = COM_truncate( $title, $_SP_CONF['title_trim_length'],
  1327                                         '...' );
  1328             if( $title != $titletouse )
  1329             {
  1330                 $attr = array('title' => htmlspecialchars($title));
  1331             }
  1332             else
  1333             {
  1334                 $attr = array();
  1335             }
  1336             $astaticpage = str_replace( '$', '&#36;', $titletouse );
  1337             $astaticpage = str_replace( ' ', '&nbsp;', $astaticpage );
  1338 
  1339             $newstaticpages[] = COM_createLink($astaticpage, $url, $attr);
  1340         }
  1341 
  1342         $retval .= COM_makeList( $newstaticpages, 'list-new-plugins' );
  1343     }
  1344     else
  1345     {
  1346         $retval .= $LANG_STATIC['no_new_pages'] . '<br' . XHTML . '>' . LB;
  1347     }
  1348 
  1349     return $retval;
  1350 }
  1351 
  1352 /**
  1353 * Return information for a static page
  1354 *
  1355 * @param    string  $sp_id      static page ID or '*'
  1356 * @param    string  $what       comma-separated list of properties
  1357 * @param    int     $uid        user ID or 0 = current user
  1358 * @param    array   $options    (reserved for future extensions)
  1359 * @return   mixed               string or array of strings with the information
  1360 *
  1361 */
  1362 function plugin_getiteminfo_staticpages($sp_id, $what, $uid = 0, $options = array())
  1363 {
  1364     global $_CONF, $_TABLES;
  1365 
  1366     // parse $what to see what we need to pull from the database
  1367     $properties = explode(',', $what);
  1368     $fields = array();
  1369     foreach ($properties as $p) {
  1370         switch ($p) {
  1371         case 'date-modified':
  1372             $fields[] = 'UNIX_TIMESTAMP(sp_date) AS unixdate';
  1373             break;
  1374         case 'description':
  1375         case 'excerpt':
  1376             $fields[] = 'sp_content';
  1377             $fields[] = 'sp_php';
  1378             break;
  1379         case 'id':
  1380             $fields[] = 'sp_id';
  1381             break;
  1382         case 'title':
  1383             $fields[] = 'sp_title';
  1384             break;
  1385         case 'url':
  1386             // needed for $sp_id == '*', but also in case we're only requesting
  1387             // the URL (so that $fields isn't emtpy)
  1388             $fields[] = 'sp_id';
  1389             break;
  1390         default:
  1391             // nothing to do
  1392             break;
  1393         }
  1394     }
  1395 
  1396     $fields = array_unique($fields);
  1397 
  1398     if (count($fields) == 0) {
  1399         $retval = array();
  1400 
  1401         return $retval;
  1402     }
  1403 
  1404     // prepare SQL request
  1405     if ($sp_id == '*') {
  1406         $where = '';
  1407         $permOp = 'WHERE';
  1408     } else {
  1409         $where = " WHERE sp_id = '" . addslashes($sp_id) . "'";
  1410         $permOp = 'AND';
  1411     }
  1412     if ($uid > 0) {
  1413         $permSql = COM_getPermSql($permOp, $uid);
  1414     } else {
  1415         $permSql = COM_getPermSql($permOp);
  1416     }
  1417     $sql = "SELECT " . implode(',', $fields)
  1418             . " FROM {$_TABLES['staticpage']}" . $where . $permSql;
  1419     if ($sp_id != '*') {
  1420         $sql .= ' LIMIT 1';
  1421     }
  1422 
  1423     $result = DB_query($sql);
  1424     $numRows = DB_numRows($result);
  1425 
  1426     $retval = array();
  1427     for ($i = 0; $i < $numRows; $i++) {
  1428         $A = DB_fetchArray($result);
  1429 
  1430         $props = array();
  1431         foreach ($properties as $p) {
  1432             switch ($p) {
  1433             case 'date-modified':
  1434                 $props['date-modified'] = $A['unixdate'];
  1435                 break;
  1436             case 'description':
  1437             case 'excerpt':
  1438                 $props[$p] = SP_render_content(stripslashes($A['sp_content']),
  1439                                                             $A['sp_php']);
  1440                 break;
  1441             case 'id':
  1442                 $props['id'] = $A['sp_id'];
  1443                 break;
  1444             case 'title':
  1445                 $props['title'] = stripslashes($A['sp_title']);
  1446                 break;
  1447             case 'url':
  1448                 if (empty($A['sp_id'])) {
  1449                     $props['url'] = COM_buildUrl($_CONF['site_url']
  1450                             . '/staticpages/index.php?page=' . $sp_id);
  1451                 } else {
  1452                     $props['url'] = COM_buildUrl($_CONF['site_url']
  1453                             . '/staticpages/index.php?page=' . $A['sp_id']);
  1454                 }
  1455                 break;
  1456             default:
  1457                 // return empty string for unknown properties
  1458                 $props[$p] = '';
  1459                 break;
  1460             }
  1461         }
  1462 
  1463         $mapped = array();
  1464         foreach ($props as $key => $value) {
  1465             if ($sp_id == '*') {
  1466                 if ($value != '') {
  1467                     $mapped[$key] = $value;
  1468                 }
  1469             } else {
  1470                 $mapped[] = $value;
  1471             }
  1472         }
  1473 
  1474         if ($sp_id == '*') {
  1475             $retval[] = $mapped;
  1476         } else {
  1477             $retval = $mapped;
  1478             break;
  1479         }
  1480     }
  1481 
  1482     if (($sp_id != '*') && (count($retval) == 1)) {
  1483         $retval = $retval[0];
  1484     }
  1485 
  1486     return $retval;
  1487 }
  1488 
  1489 /**
  1490 * Provide URL of a documentation file
  1491 *
  1492 * @param    string  $file   documentation file being requested, e.g. 'config'
  1493 * @return   mixed           URL or false when not available
  1494 *
  1495 */
  1496 function plugin_getdocumentationurl_staticpages($file)
  1497 {
  1498     global $_CONF;
  1499 
  1500     static $docurl;
  1501 
  1502     switch ($file) {
  1503     case 'index':
  1504     case 'config':
  1505         if (isset($docurl)) {
  1506             $retval = $docurl;
  1507         } else {
  1508             $doclang = COM_getLanguageName();
  1509             $docs = 'docs/' . $doclang . '/staticpages.html';
  1510             if (file_exists($_CONF['path_html'] . $docs)) {
  1511                 $retval = $_CONF['site_url'] . '/' . $docs;
  1512             } else {
  1513                 $retval = $_CONF['site_url'] . '/docs/english/staticpages.html';
  1514             }
  1515             $docurl = $retval;
  1516         }
  1517         break;
  1518 
  1519     default:
  1520         $retval = false;
  1521         break;
  1522     }
  1523 
  1524     return $retval;
  1525 }
  1526 
  1527 /**
  1528 * Provide URL and ID for the link to a comment's parent
  1529 *
  1530 * NOTE: The Plugin API does not support $_CONF['url_rewrite'] here,
  1531 *       so we'll end up with a non-rewritten URL ...
  1532 *
  1533 * @return   array   array consisting of the base URL and the ID name
  1534 *
  1535 */
  1536 function plugin_getcommenturlid_staticpages()
  1537 {
  1538     global $_CONF;
  1539 
  1540     $tmp = array(
  1541         $_CONF['site_url'] . '/staticpages/index.php',
  1542         'page'
  1543     );
  1544 
  1545     return $tmp;
  1546 }
  1547 
  1548 ?>