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