1
0
mirror of https://github.com/e107inc/e107.git synced 2025-01-17 12:48:24 +01:00

Reworked the shortcode handler again. This should now fully support the old .sc and the newer function (oor class->method) styles. I hope I didn't break it too much.

This commit is contained in:
mcfly 2009-01-08 17:23:13 +00:00
parent 88a9ffa203
commit ddff8df497
3 changed files with 271 additions and 223 deletions

View File

@ -0,0 +1,130 @@
<?php
/* $Id: menu.php,v 1.1 2009-01-08 17:23:13 mcfly_e107 Exp $ */
function menu_shortcode($parm)
{
global $sql, $ns, $tp, $sc_style;
global $eMenuList, $error_handler;
$e107 = e107::getInstance();
$tmp = explode(':',$parm);
$buffer_output = true; // Default - return all output.
if (isset($tmp[1]) && $tmp[1] == 'echo') { $buffer_output = false; }
if (!array_key_exists($tmp[0], $eMenuList)) { return; }
if ($buffer_output)
{
ob_start();
}
foreach($eMenuList[$tmp[0]] as $row)
{
$show_menu = TRUE;
if($row['menu_pages'])
{
list($listtype, $listpages) = explode('-', $row['menu_pages']);
$pagelist = explode('|',$listpages);
$check_url = e_SELF.(e_QUERY ? '?'.e_QUERY : '');
if($listtype == '1') //show menu
{
$show_menu = FALSE;
foreach($pagelist as $p)
{
if(substr($p, -1) == '!')
{
$p = substr($p, 0, -1);
if(substr($check_url, strlen($p)*-1) == $p)
{
$show_menu = TRUE;
}
}
else
{
if(strpos($check_url,$p) !== FALSE)
{
$show_menu = TRUE;
}
}
}
}
elseif($listtype == '2') //hide menu
{
$show_menu = TRUE;
foreach($pagelist as $p) {
if(substr($p, -1) == '!')
{
$p = substr($p, 0, -1);
if(substr($check_url, strlen($p)*-1) == $p)
{
$show_menu = FALSE;
}
}
else
{
if(strpos($check_url, $p) !== FALSE)
{
$show_menu = FALSE;
}
}
}
}
}
if($show_menu)
{
$mname = $row['menu_name'];
if($error_handler->debug == true)
{
echo "\n<!-- Menu Start: ".$mname." -->\n";
}
$sql->db_Mark_Time($row['menu_name']);
if(is_numeric($row['menu_path']))
{
$sql -> db_Select("page", "*", "page_id='".$row['menu_path']."' ");
$page = $sql -> db_Fetch();
$caption = $e107->tp->toHTML($page['page_title'], TRUE, 'parse_sc, constants');
$text = $e107->tp->toHTML($page['page_text'], TRUE, 'parse_sc, constants');
$e107->ns->tablerender($caption, $text);
}
else
{
if (is_readable(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE.".php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE.".php");
}
elseif (is_readable(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE."/".e_LANGUAGE.".php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE."/".e_LANGUAGE.".php");
}
elseif (is_readable(e_PLUGIN.$row['menu_path']."/languages/English.php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/English.php");
}
elseif (is_readable(e_PLUGIN.$row['menu_path']."/languages/English/English.php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/English/English.php");
}
if(file_exists(e_PLUGIN.$row['menu_path']."/".$mname.".php"))
{
include_once(e_PLUGIN.$row['menu_path']."/".$mname.".php");
}
}
$sql->db_Mark_Time("(After ".$mname.")");
if ($error_handler->debug == true)
{
echo "\n<!-- Menu End: ".$mname." -->\n";
}
}
}
if ($buffer_output)
{
$ret = ob_get_contents();
ob_end_clean();
return $ret;
}
}

View File

@ -1,128 +0,0 @@
/* $Id: menu.sc,v 1.4 2008-05-30 20:45:53 e107steved Exp $ */
global $sql;
global $ns;
global $eMenuList;
global $error_handler;
$tmp = explode(":",$parm);
$buffer_output = TRUE; // Default - return all output.
if (isset($tmp[1]) && $tmp[1] == 'echo') $buffer_output = FALSE;
if (isset($tmp[1]) && $tmp[1] == 'ret') $buffer_output = TRUE; // 0.7 compatible parameter
if (!array_key_exists($tmp[0],$eMenuList)) {
return;
}
if ($buffer_output)
{
ob_start();
}
foreach($eMenuList[$tmp[0]] as $row)
{
$show_menu = TRUE;
if($row['menu_pages']) {
list($listtype,$listpages) = explode("-",$row['menu_pages']);
$pagelist = explode("|",$listpages);
$check_url = e_SELF.(e_QUERY ? "?".e_QUERY : '');
if($listtype == '1') //show menu
{
$show_menu = FALSE;
foreach($pagelist as $p)
{
if(substr($p, -1) == '!')
{
$p = substr($p, 0, -1);
if(substr($check_url, strlen($p)*-1) == $p)
{
$show_menu = TRUE;
}
}
else
{
if(strpos($check_url,$p) !== FALSE)
{
$show_menu = TRUE;
}
}
}
}
elseif($listtype == '2') //hide menu
{
$show_menu = TRUE;
foreach($pagelist as $p) {
if(substr($p, -1) == '!')
{
$p = substr($p, 0, -1);
if(substr($check_url, strlen($p)*-1) == $p)
{
$show_menu = FALSE;
}
}
else
{
if(strpos($check_url, $p) !== FALSE)
{
$show_menu = FALSE;
}
}
}
}
}
if($show_menu)
{
$mname = $row['menu_name'];
if($error_handler->debug == true)
{
echo "\n<!-- Menu Start: ".$mname." -->\n";
}
$sql->db_Mark_Time($row['menu_name']);
if(is_numeric($row['menu_path']))
{
global $tp;
$sql -> db_Select("page", "*", "page_id='".$row['menu_path']."' ");
$page = $sql -> db_Fetch();
$caption = $tp -> toHTML($page['page_title'], TRUE, 'parse_sc, constants');
$text = $tp -> toHTML($page['page_text'], TRUE, 'parse_sc, constants');
$ns -> tablerender($caption, $text);
}
else
{
if (is_readable(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE.".php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE.".php");
}
elseif (is_readable(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE."/".e_LANGUAGE.".php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/".e_LANGUAGE."/".e_LANGUAGE.".php");
}
elseif (is_readable(e_PLUGIN.$row['menu_path']."/languages/English.php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/English.php");
}
elseif (is_readable(e_PLUGIN.$row['menu_path']."/languages/English/English.php"))
{
include_once(e_PLUGIN.$row['menu_path']."/languages/English/English.php");
}
if(file_exists(e_PLUGIN.$row['menu_path']."/".$mname.".php"))
{
include_once(e_PLUGIN.$row['menu_path']."/".$mname.".php");
}
}
$sql->db_Mark_Time("(After ".$mname.")");
if ($error_handler->debug == true)
{
echo "\n<!-- Menu End: ".$mname." -->\n";
}
}
}
if ($buffer_output)
{
$ret = ob_get_contents();
ob_end_clean();
return $ret;
}

View File

@ -12,51 +12,73 @@
| GNU General Public License (http://gnu.org).
|
| $Source: /cvs_backup/e107_0.8/e107_handlers/shortcode_handler.php,v $
| $Revision: 1.15 $
| $Date: 2009-01-07 19:57:09 $
| $Revision: 1.16 $
| $Date: 2009-01-08 17:23:13 $
| $Author: mcfly_e107 $
+----------------------------------------------------------------------------+
*/
if (!defined('e107_INIT')) { exit; }
function register_shortcode($class, $codes, $path='', $force=false)
function register_shortcode($classFunc, $codes, $path='', $force=false)
{
global $e_shortcodes;
if(!is_array($codes))
$e107 = e107::getInstance();
$sc = &$e107->tp->e_sc;
//We only register these shortcodes if they have not already been registered in some manner
//ie theme or other plugin .sc files
if(is_array($codes))
{
$codes = array($codes);
}
foreach($codes as $code)
{
$code = strtoupper($code);
if(!array_key_exists($code, $e_shortcodes) || $force == true)
foreach($codes as $code)
{
$e_shortcodes[$code] = array('path' => $path, 'class' => $class, 'function' => $function);
$code = strtoupper($code);
if(!$sc->isRegistered($code) || $force == true)
{
$sc->registered_codes[$code] = array('type' => 'class', 'path' => $path, 'class' => $classFunc);
}
}
}
else
{
$codes = strtoupper($codes);
if(!$sc->isRegistered($code) || $force == true)
{
$sc->registered_codes[$codes] = array('type' => 'func', $path = 'path', 'function' => $classFunc);
}
}
}
class e_shortcode
{
var $scList; // The actual code - added by parsing files or when plugin codes encountered. Array key is the shortcode name.
var $parseSCFiles; // True if individual shortcode files are to be used
var $addedCodes; // Apparently not used
var $registered_codes; // Shortcodes added by plugins
var $scClasses; //Batch shortcode classes
var $scList = array(); // The actual code - added by parsing files or when plugin codes encountered. Array key is the shortcode name.
var $parseSCFiles; // True if individual shortcode files are to be used
var $addedCodes; // Apparently not used
var $registered_codes = array(); // Shortcodes added by plugins
var $scClasses = array(); // Batch shortcode classes
function e_shortcode()
{
global $pref, $register_sc;
$this->parseSCFiles = TRUE; // Default probably never used, but make sure its defined.
$this->parseSCFiles = true; // Default probably never used, but make sure its defined.
$this->registered_codes = array(); // Think this used to access an undefined variable
if(varset($pref['shortcode_list'],'') != '')
// Register any shortcodes that were registered by the theme
// $register_sc[] = 'MY_THEME_CODE'
if(isset($register_sc) && is_array($register_sc))
{
foreach($pref['shortcode_list'] as $path=>$namearray)
foreach($register_sc as $code)
{
foreach($namearray as $code=>$uclass)
$code = strtoupper($code);
$this->registered_codes[$code]['type'] = 'theme';
}
}
// Register all .sc files found in plugin directories (via pref)
if(varset($pref['shortcode_list'], '') != '')
{
foreach($pref['shortcode_list'] as $path => $namearray)
{
foreach($namearray as $code => $uclass)
{
if($code == 'shortcode_config')
{
@ -65,23 +87,22 @@ class e_shortcode
else
{
$code = strtoupper($code);
$this->registered_codes[$code]['type'] = 'plugin';
$this->registered_codes[$code]['path'] = $path;
$this->registered_codes[$code]['perms'] = $uclass; // Add this in
if(!$this->isRegistered($code))
{
$this->registered_codes[$code]['type'] = 'plugin';
$this->registered_codes[$code]['path'] = $path;
$this->registered_codes[$code]['perms'] = $uclass; // Add this in
}
}
}
}
}
if(isset($register_sc) && is_array($register_sc))
{
foreach($register_sc as $code)
{
$this->registered_codes[$code]['type'] = 'theme';
}
}
}
function isRegistered($code)
{
return in_array($code, $this->registered_codes);
}
function parseCodes($text, $useSCFiles = true, $extraCodes = '')
{
@ -101,16 +122,13 @@ class e_shortcode
function doCode($matches)
{
global $pref, $e107cache, $menu_pref, $sc_style, $parm, $sql, $e_shortcodes;
global $pref, $e107cache, $menu_pref, $sc_style, $parm, $sql;
if(strpos($matches[1], E_NL) !== false)
{
return $matches[0];
}
if(strpos($matches[1], E_NL) !== false) { return $matches[0]; }
if (strpos($matches[1], '='))
{
list($code, $parm) = explode("=", $matches[1], 2);
list($code, $parm) = explode('=', $matches[1], 2);
}
else
{
@ -138,81 +156,110 @@ class e_shortcode
$db_debug->logCode(2, $code, $parm, "");
}
/* Check for shortcode registered with $e_shortcodes */
if (is_array($e_shortcodes) && (array_key_exists($code, $e_shortcodes)))
if(E107_DBG_BBSC)
{
$_class = $e_shortcodes[$code]['class'];
$_method = 'get_'.strtolower($code);
if(!isset($this->scClasses[$_class]))
{
if(!class_exists($_class) && $e_shortcodes[$code]['path'])
{
include_once($e_shortcodes[$code]['path'].$_class.'.php');
}
$this->scClasses[$_class] = new $_class;
}
if(is_callable(array($_class, $_method)))
{
$ret = $this->scClasses[$_class]->$_method($parm);
}
trigger_error('starting shortcode {'.$code.'}', E_USER_ERROR);
}
$scCode = '';
$scFile = '';
// Check to see if we've already loaded the .sc file contents
if (array_key_exists($code, $this->scList))
{
$scCode = $this->scList[$code];
}
else
{
if (is_array($this->scList) && array_key_exists($code, $this->scList))
//.sc file not yet loaded, or shortcode is new function type
if ($this->parseSCFiles == true)
{
$shortcode = $this->scList[$code];
}
else
{
if ($this->parseSCFiles == TRUE)
if (array_key_exists($code, $this->registered_codes))
{
if (is_array($this -> registered_codes) && array_key_exists($code, $this->registered_codes))
//shortcode is registered in some manner, let's parse the type
switch($this->registered_codes[$code]['type'])
{
if($this->registered_codes[$code]['type'] == 'plugin')
{
if (check_class($this->registered_codes[$code]['perms']))
{ // Use the plugin 'override' shortcode
case 'class':
//If class is set, it's a batch shortcode. Load the class and call the method
$_class = $this->registered_codes[$code]['class'];
$_method = 'get_'.strtolower($code);
if(!isset($this->scClasses[$_class]))
{
if(!class_exists($_class) && $this->registered_codes[$code]['path'])
{
include_once($this->registered_codes[$code]['path'].$_class.'.php');
}
$this->scClasses[$_class] = new $_class;
}
if(is_callable(array($_class, $_method)))
{
$ret = $this->scClasses[$_class]->$_method($parm);
}
break;
case 'func':
//It is a function, so include the file and call the function
$_function = $this->registered_codes[$code]['function'];
if($this->registered_codes[$code]['path'])
{
include_once($this->registered_codes[$code]['path'].strtolower($code).'.php');
}
if(function_exists($_function))
{
$ret = call_user_func($_function, $parm);
}
break;
case 'plugin':
$scFile = e_PLUGIN.strtolower($this->registered_codes[$code]['path']).'/'.strtolower($code).'.sc';
}
else
{ // Look for a core shortcode
$scFile = e_FILE."shortcode/".strtolower($code).".sc";
}
}
else
{
break;
case 'theme':
$scFile = THEME.strtolower($code).'.sc';
break;
}
}
else
{
// Code is not registered, let's look for .sc or .php file
// .php file takes precedence over .sc file
if(is_readable(e_FILE.'shortcode/'.strtolower($code).'.php'))
{
$_function = strtolower($code).'_shortcode';
include_once(e_FILE.'shortcode/'.strtolower($code).'.php');
if(function_exists($_function))
{
$ret = call_user_func($_function, $parm);
}
}
else
{
$scFile = e_FILE."shortcode/".strtolower($code).".sc";
}
if (file_exists($scFile))
{
$shortcode = file_get_contents($scFile);
$this->scList[$code] = $shortcode;
$scFile = e_FILE.'shortcode/'.strtolower($code).'.sc';
}
}
if ($scFile && file_exists($scFile))
{
$scCode = file_get_contents($scFile);
$this->scList[$code] = $scCode;
}
}
if (!isset($shortcode))
if (!isset($scCode))
{
if(E107_DBG_BBSC) trigger_error("shortcode not found:{".$code."}", E_USER_ERROR);
if(E107_DBG_BBSC) trigger_error('shortcode not found:{'.$code.'}', E_USER_ERROR);
return $matches[0];
}
if(E107_DBG_SC)
if(E107_DBG_SC && $scFile)
{
echo (isset($scFile)) ? "<br />sc_file= ".str_replace(e_FILE."shortcode/","",$scFile)."<br />" : "";
echo (isset($scFile)) ? "<br />sc_file= ".str_replace(e_FILE.'shortcode/', '', $scFile).'<br />' : '';
echo "<br />sc= <b>$code</b>";
}
}
if(E107_DBG_BBSC)
{
trigger_error("starting shortcode {".$code."}", E_USER_ERROR);
}
$ret = eval($shortcode);
if($scCode)
{
$ret = eval($scCode);
}
if($ret != '' || is_numeric($ret))
@ -220,9 +267,9 @@ class e_shortcode
//if $sc_mode exists, we need it to parse $sc_style
if($sc_mode)
{
$code = $code."|".$sc_mode;
$code = $code.'|'.$sc_mode;
}
if(isset($sc_style) && is_array($sc_style) && array_key_exists($code,$sc_style))
if(isset($sc_style) && is_array($sc_style) && array_key_exists($code, $sc_style))
{
if(isset($sc_style[$code]['pre']))
{
@ -247,7 +294,7 @@ class e_shortcode
$cur_shortcodes = array();
if($type == 'file')
{
$batch_cachefile = "nomd5_scbatch_".md5($fname);
$batch_cachefile = 'nomd5_scbatch_'.md5($fname);
// $cache_filename = $e107cache->cache_fname("nomd5_{$batchfile_md5}");
$sc_cache = $e107cache->retrieve_sys($batch_cachefile);
if(!$sc_cache)
@ -293,7 +340,7 @@ class e_shortcode
foreach(array_keys($cur_shortcodes) as $cur_sc)
{
if (is_array($this -> registered_codes) && array_key_exists($cur_sc, $this -> registered_codes))
if (array_key_exists($cur_sc, $this -> registered_codes))
{
if ($this -> registered_codes[$cur_sc]['type'] == 'plugin')
{
@ -312,5 +359,4 @@ class e_shortcode
return $cur_shortcodes;
}
}
?>
?>