diff options
Diffstat (limited to 'phpBB/phpbb/template/context.php')
| -rw-r--r-- | phpBB/phpbb/template/context.php | 115 | 
1 files changed, 114 insertions, 1 deletions
| diff --git a/phpBB/phpbb/template/context.php b/phpBB/phpbb/template/context.php index 5d04a09865..392efd5933 100644 --- a/phpBB/phpbb/template/context.php +++ b/phpBB/phpbb/template/context.php @@ -87,6 +87,17 @@ class context  	}  	/** +	* Retreive a single scalar value from a single key. +	* +	* @param string $varname Variable name +	* @return mixed Variable value, or null if not set +	*/ +	public function retrieve_var($varname) +	{ +		return isset($this->rootref[$varname]) ? $this->rootref[$varname] : null; +	} + +	/**  	* Returns a reference to template data array.  	*  	* This function is public so that template renderer may invoke it. @@ -264,6 +275,68 @@ class context  	}  	/** +	* Retrieve key variable pairs from the specified block +	* +	* @param string $blockname Name of block to retrieve $vararray from +	* @param array $vararray An array of variable names, empty array retrieves all vars +	* @return array of hashes with variable name as key and retrieved value or null as value +	*/ +	public function retrieve_block_vars($blockname, array $vararray) +	{ +		// For nested block, $blockcount > 0, for top-level block, $blockcount == 0 +		$blocks = explode('.', $blockname); +		$blockcount = sizeof($blocks) - 1; + +		$block = $this->tpldata; +		for ($i = 0; $i <= $blockcount; $i++) +		{ +			if (($pos = strpos($blocks[$i], '[')) !== false) +			{ +				$name = substr($blocks[$i], 0, $pos); + +				if (strpos($blocks[$i], '[]') === $pos) +				{ +					$index = sizeof($block[$name]) - 1; +				} +				else +				{ +					$index = min((int) substr($blocks[$i], $pos + 1, -1), sizeof($block[$name]) - 1); +				} +			} +			else +			{ +				$name = $blocks[$i]; +				$index = sizeof($block[$name]) - 1; +			} +			$block = $block[$name]; +			$block = $block[$index]; +		} + +		$result = array(); +		if ($vararray === array()) +		{ +			// The calculated vars that depend on the block position are excluded from the complete block returned results +			$excluded_vars = array('S_FIRST_ROW', 'S_LAST_ROW', 'S_BLOCK_NAME', 'S_NUM_ROWS', 'S_ROW_COUNT', 'S_ROW_NUM'); + +			foreach ($block as $varname => $varvalue) +			{ +				if ($varname === strtoupper($varname) && !is_array($varvalue) && !in_array($varname, $excluded_vars)) +				{ +					$result[$varname] = $varvalue; +				} +			} +		} +		else +		{ +			foreach ($vararray as $varname) +			{ +				$result[$varname] = isset($block[$varname]) ? $block[$varname] : null; +			} +		} +		return $result; +	} + +	/**  	* Find the index for a specified key in the innermost specified block  	*  	* @param	string	$blockname	the blockname, for example 'loop' @@ -363,10 +436,11 @@ class context  	* If key is false the position is set to 0  	* If key is true the position is set to the last entry  	* -	* @param	string	$mode		Mode to execute (valid modes are 'insert' and 'change') +	* @param	string	$mode		Mode to execute (valid modes are 'insert', 'change' and 'delete')  	*  	*	If insert, the vararray is inserted at the given position (position counting from zero).  	*	If change, the current block gets merged with the vararray (resulting in new key/value pairs be added and existing keys be replaced by the new \value). +	*	If delete, the vararray is ignored, and the block at the given position (counting from zero) is removed.  	*  	* Since counting begins by zero, inserting at the last position will result in this array: array(vararray, last positioned array)  	* and inserting at position 1 will result in this array: array(first positioned array, vararray, following vars) @@ -502,6 +576,45 @@ class context  			return true;  		} +		// Delete Block +		if ($mode == 'delete') +		{ +			// If we are exceeding last iteration, do not delete anything +			if ($key > sizeof($block) || $key < 0) +			{ +				return false; +			} + +			// If we are positioned at the end, we remove the last element +			if ($key == sizeof($block)) +			{ +				$key--; +			} + +			// We are deleting the last element in the block, so remove the block +			if (sizeof($block) === 1) +			{ +				$block = null; // unset($block); does not work on references +				return true; +			} + +			// Re-position template blocks +			for ($i = $key; $i < sizeof($block)-1; $i++) +			{ +				$block[$i] = $block[$i+1]; +				$block[$i]['S_ROW_COUNT'] = $block[$i]['S_ROW_NUM'] = $i; +			} + +			// Remove the last element +			unset($block[$i]); + +			// Set first and last elements again, in case they were removed +			$block[0]['S_FIRST_ROW'] = true; +			$block[sizeof($block)-1]['S_LAST_ROW'] = true; + +			return true; +		} +  		return false;  	} | 
