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