Project

General

Profile

« Previous | Next » 

Revision 1301

Added by Dietmar over 14 years ago

Tickets #932 change deprecated eregi functions
Tickets #948 fixed Multiple use of same parametrised droplet - parameter handling
Upgrade Droplets to Version 1.0.3
update some headerinfos
non existing pages, will be created if clicking save in page settings

View differences:

droplets.php
2 2
/**
3 3
 *
4 4
 * @category        module
5
 * @package         droplet
5
 * @package         droplets
6 6
 * @author          Ruud Eisinga (Ruud) John (PCWacht)
7 7
 * @author          WebsiteBaker Project
8 8
 * @copyright       2004-2009, Ryan Djurovich
......
15 15
 * @filesource		$HeadURL$
16 16
 * @lastmodified    $Date$
17 17
 *
18
 */
19

  
20
/*
21
 *	@version	1.0.2
22
 *	@date		June 2009
23
 *
24 18
 *	droplets are small codeblocks that are called from anywhere in the template.
25 19
 * 	To call a droplet just use [[dropletname]]. optional parameters for a droplet can be used like [[dropletname?parameter=value&parameter2=value]]\
26 20
 *
27
 *  1.0.2, bugfix. Reused the evalDroplet function so the extracted parameters will be only available within the scope of the eval and cleared when ready.
21
 *  1.0.2, bugfix, Reused the evalDroplet function so the extracted parameters will be only available within the scope of the eval and cleared when ready.
22
 *  1.0.3, optimize, reduce memory consumption, increase speed, remove CSS, enable nested droplets
23
 *
28 24
 */
29 25

  
30
function evalDroplets ($wb_page_data) {
31
	global $database;
32
	$parameter = array();
33
	preg_match_all('~\[\[(.*?)\]\]~', $wb_page_data, $matches);
34
	foreach ($matches[1] as $match) {
35
		if (strpos($match,"?")) {
36
			list ($droplet,$params) = explode("?",$match);
37
			if(!empty($params)) {
38
				$params = html_entity_decode($params,ENT_COMPAT,DEFAULT_CHARSET); // make sure we can parse the parameters correctly
39
				$paramarray = explode("&",$params); //create array of parms as parm=value
40
				foreach ($paramarray as $paramelement) {
41
					$parameterTemp = explode("=", $paramelement,2);
42
					if (count($parameterTemp) == 2)
43
						$parameter[$parameterTemp[0]] = htmlentities($parameterTemp[1],ENT_COMPAT,DEFAULT_CHARSET); //re-encode the parameter values
26
	function do_eval($_x_codedata, $_x_varlist, &$wb_page_data)
27
	{
28
		extract($_x_varlist, EXTR_SKIP);
29
		return(eval($_x_codedata));
30
	}
31

  
32
	function processDroplets( &$wb_page_data ) {
33
// collect all droplets from document
34
		$droplet_tags = array();
35
		$droplet_replacements = array();
36
		if( preg_match_all( '/\[\[(.*?)\]\]/', $wb_page_data, $found_droplets ) )
37
		{
38
			foreach( $found_droplets[1] as $droplet )
39
			{
40
				if(array_key_exists( '[['.$droplet.']]', $droplet_tags) == false)
41
				{
42
// go in if same droplet with same arguments is not processed already
43
					$varlist = array();
44
// split each droplet command into droplet_name and request_string
45
					$tmp = preg_split('/\?/', $droplet, 2);
46
					$droplet_name = $tmp[0];
47
					$request_string = (isset($tmp[1]) ? $tmp[1] : '');
48
					if( $request_string != '' )
49
					{
50
// make sure we can parse the arguments correctly
51
						$request_string = html_entity_decode($request_string, ENT_COMPAT,DEFAULT_CHARSET);
52
// create array of arguments from query_string
53
						$argv = preg_split( '/&(?!amp;)/', $request_string );
54
						foreach ($argv as $argument)
55
						{
56
// split argument in pair of varname, value
57
							list( $variable, $value ) = explode('=', $argument,2);
58
							if( !empty($value) )
59
							{
60
// re-encode the value and push the var into varlist
61
								$varlist[$variable] = htmlentities($value, ENT_COMPAT,DEFAULT_CHARSET);
62
							}
63
						}
64
					}
44 65
					else
45
						$parameter['parm'] = htmlentities($parameterTemp[0],ENT_COMPAT,DEFAULT_CHARSET);
66
					{
67
// no arguments given, so
68
						$droplet_name = $droplet;
69
					}
70
// request the droplet code from database
71
					$sql = 'SELECT `code` FROM `'.TABLE_PREFIX.'mod_droplets` WHERE `name` LIKE "'.$droplet_name.'" AND `active` = 1';
72
					$codedata = $GLOBALS['database']->get_one($sql);
73
					if (!is_null($codedata))
74
					{
75
						$newvalue = do_eval($codedata, $varlist, $wb_page_data);
76
// check returnvalue (must be a string of 1 char at least or (bool)true
77
						if ($newvalue == '' && $newvalue !== true)
78
						{
79
							if(DEBUG === true)
80
							{
81
								$newvalue = '<span class="mod_droplets_err">Error in: '.$droplet.', no valid returnvalue.</span>';
82
							}
83
							else
84
							{
85
								$newvalue = true;
86
							}
87
						}
88
						if ($newvalue === true) { $newvalue = ""; }
89
// remove any defined CSS section from code. For valid XHTML a CSS-section is allowed inside <head>...</head> only!
90
						$newvalue = preg_replace('/<style.*>.*<\/style>/siU', '', $newvalue);
91
// push droplet-tag and it's replacement into Search/Replace array after executing only
92
						$droplet_tags[]         = '[['.$droplet.']]';
93
						$droplet_replacements[] = $newvalue;
94
					}
46 95
				}
47
			}
48
		} else {
49
			$droplet = $match;
50
			$parameter = "";
96
			}	// End foreach( $found_droplets[1] as $droplet )
97
// replace each Droplet-Tag with coresponding $newvalue
98
			$wb_page_data = str_replace($droplet_tags, $droplet_replacements, $wb_page_data);
51 99
		}
52
		$query_content = $database->query("SELECT * FROM ".TABLE_PREFIX."mod_droplets WHERE name = '$droplet' AND active = 1 ");
53
		if ($query_content && $query_content->numRows() > 0){
54
			$fetch_content = $query_content->fetchRow();
55
			$codedata = ($fetch_content['code']);
56
			$newvalue = evalDroplet($codedata, $parameter, $wb_page_data);
57
			if ($newvalue == "" && !$newvalue === true) 
58
				$newvalue = "<font color=\"red\">Error in: $match, no correct returnvalue.</font>";
59
			if ($newvalue === true) 
60
				$newvalue = "";
61
			$wb_page_data = str_replace("[[".$match."]]", $newvalue, $wb_page_data);
100
// returns TRUE if droplets found in content, FALSE if not
101
		return( count($droplet_tags)!=0 );
102
	}
103

  
104
	function evalDroplets( &$wb_page_data, $max_loops = 3 ) {
105
		$max_loops = ((int)$max_loops = 0 ? 3 : (int)$max_loops);
106
		while( (processDroplets($wb_page_data) == true) && ($max_loops > 0))
107
		{ 
108
			$max_loops--;
62 109
		}
110
		return $wb_page_data;
63 111
	}
64
	return $wb_page_data;
65
}
66 112

  
67
function evalDroplet($droplet, $params, &$wb_page_data) {
68
    if(is_array($params)) extract($params, EXTR_SKIP);
69
	return eval($droplet);
70
}
71 113
?>

Also available in: Unified diff