Jump to content

Using a function in a array


Cardale

Recommended Posts

I wanted to use a function in a array in my template system, and its working but its generating the function output before everything else. I don't know why this is happening when I use variables its displays exactly where I want it.  If there is a better way to handle it I'm open to suggestions...let me know.

 

Thanks for any help.

Link to comment
https://forums.phpfreaks.com/topic/75608-using-a-function-in-a-array/
Share on other sites

Let me know if you want the whole file.  I will send it via email or IM.

 

		$vpt = new Template('./templates/'.$vp_options['template']);
	$vpt->set_filenames(array('template' => 'template.html'));
		$vpt->loadfile('template');

$t_ = array(
	'COPYRIGHT' 			=> $copyright,
	'TEMPLATEPATH' 			=> $templatepath,
	'SITETITLE' 			=> $sitetitle,
	'TEMPLATE_STYLE'	 	=> $stylesheet,
	'PLUGIN4'	 			=> $plugin4,
	'DISPLAYLOGIN'	 		=> DISPLAYLOGIN(),
      	'RECENTCHALLENGES'	 	=> RECENTCHALLENGES(),
      	'DISPLAY'	 			=> $displayswitch
);

	$vpt->assign_vars($t_);//the name of the array
$vpt->pparse('template');//the name of the file 

 

	function loadfile($handle)
{
	// If the file for this handle is already loaded and compiled, do nothing.
	if (isset($this->uncompiled_code[$handle]) && !empty($this->uncompiled_code[$handle]))
	{
		return true;
	}

	// If we don't have a file assigned to this handle, die.
	if (!isset($this->files[$handle]))
	{
		die("Template->loadfile(): No file specified for handle $handle");
	}

	$filename = $this->files[$handle];

	$str = implode("", @file($filename));
	if (empty($str))
	{
		die("Template->loadfile(): File $filename for handle $handle is empty");
	}

	$this->uncompiled_code[$handle] = $str;

	return true;
}

 

	function compile($code, $do_not_echo = false, $retvar = '')
{
	// replace \ with \\ and then ' with \'.
	$code = str_replace('\\', '\\\\', $code);
	$code = str_replace('\'', '\\\'', $code);

	// change template varrefs into PHP varrefs

	// This one will handle varrefs WITH namespaces
	$varrefs = array();
	preg_match_all('#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is', $code, $varrefs);
	$varcount = sizeof($varrefs[1]);
	for ($i = 0; $i < $varcount; $i++)
	{
		$namespace = $varrefs[1][$i];
		$varname = $varrefs[3][$i];
		$new = $this->generate_block_varref($namespace, $varname);

		$code = str_replace($varrefs[0][$i], $new, $code);
	}

	// This will handle the remaining root-level varrefs
	$code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', '\' . ( ( isset($this->_tpldata[\'.\'][0][\'\1\']) ) ? $this->_tpldata[\'.\'][0][\'\1\'] : \'\' ) . \'', $code);

	// Break it up into lines.
	$code_lines = explode("\n", $code);

	$block_nesting_level = 0;
	$block_names = array();
	$block_names[0] = ".";

	// Second: prepend echo ', append ' . "\n"; to each line.
	$line_count = sizeof($code_lines);
	for ($i = 0; $i < $line_count; $i++)
	{
		$code_lines[$i] = chop($code_lines[$i]);
		if (preg_match('#<!-- BEGIN (.*?) -->#', $code_lines[$i], $m))
		{
			$n[0] = $m[0];
			$n[1] = $m[1];

			// Added: dougk_ff7-Keeps templates from bombing if begin is on the same line as end.. I think. 
			if ( preg_match('#<!-- END (.*?) -->#', $code_lines[$i], $n) )
			{
				$block_nesting_level++;
				$block_names[$block_nesting_level] = $m[1];
				if ($block_nesting_level < 2)
				{
					// Block is not nested.
					$code_lines[$i] = '$_' . $n[1] . '_count = ( isset($this->_tpldata[\'' . $n[1] . '.\']) ) ?  sizeof($this->_tpldata[\'' . $n[1] . '.\']) : 0;';
					$code_lines[$i] .= "\n" . 'for ($_' . $n[1] . '_i = 0; $_' . $n[1] . '_i < $_' . $n[1] . '_count; $_' . $n[1] . '_i++)';
					$code_lines[$i] .= "\n" . '{';
				}
				else
				{
					// This block is nested.

					// Generate a namespace string for this block.
					$namespace = implode('.', $block_names);
					// strip leading period from root level..
					$namespace = substr($namespace, 2);
					// Get a reference to the data array for this block that depends on the
					// current indices of all parent blocks.
					$varref = $this->generate_block_data_ref($namespace, false);
					// Create the for loop code to iterate over this block.
					$code_lines[$i] = '$_' . $n[1] . '_count = ( isset(' . $varref . ') ) ? sizeof(' . $varref . ') : 0;';
					$code_lines[$i] .= "\n" . 'for ($_' . $n[1] . '_i = 0; $_' . $n[1] . '_i < $_' . $n[1] . '_count; $_' . $n[1] . '_i++)';
					$code_lines[$i] .= "\n" . '{';
				}

				// We have the end of a block.
				unset($block_names[$block_nesting_level]);
				$block_nesting_level--;
				$code_lines[$i] .= '} // END ' . $n[1];
				$m[0] = $n[0];
				$m[1] = $n[1];
			}
			else
			{
				// We have the start of a block.
				$block_nesting_level++;
				$block_names[$block_nesting_level] = $m[1];
				if ($block_nesting_level < 2)
				{
					// Block is not nested.
					$code_lines[$i] = '$_' . $m[1] . '_count = ( isset($this->_tpldata[\'' . $m[1] . '.\']) ) ? sizeof($this->_tpldata[\'' . $m[1] . '.\']) : 0;';
					$code_lines[$i] .= "\n" . 'for ($_' . $m[1] . '_i = 0; $_' . $m[1] . '_i < $_' . $m[1] . '_count; $_' . $m[1] . '_i++)';
					$code_lines[$i] .= "\n" . '{';
				}
				else
				{
					// This block is nested.

					// Generate a namespace string for this block.
					$namespace = implode('.', $block_names);
					// strip leading period from root level..
					$namespace = substr($namespace, 2);
					// Get a reference to the data array for this block that depends on the
					// current indices of all parent blocks.
					$varref = $this->generate_block_data_ref($namespace, false);
					// Create the for loop code to iterate over this block.
					$code_lines[$i] = '$_' . $m[1] . '_count = ( isset(' . $varref . ') ) ? sizeof(' . $varref . ') : 0;';
					$code_lines[$i] .= "\n" . 'for ($_' . $m[1] . '_i = 0; $_' . $m[1] . '_i < $_' . $m[1] . '_count; $_' . $m[1] . '_i++)';
					$code_lines[$i] .= "\n" . '{';
				}
			}
		}
		else if (preg_match('#<!-- END (.*?) -->#', $code_lines[$i], $m))
		{
			// We have the end of a block.
			unset($block_names[$block_nesting_level]);
			$block_nesting_level--;
			$code_lines[$i] = '} // END ' . $m[1];
		}
		else
		{
			// We have an ordinary line of code.
			if (!$do_not_echo)
			{
				$code_lines[$i] = 'echo \'' . $code_lines[$i] . '\' . "\\n";';
			}
			else
			{
				$code_lines[$i] = '$' . $retvar . '.= \'' . $code_lines[$i] . '\' . "\\n";'; 
			}
		}
	}

	// Bring it back into a single string of lines of code.
	$code = implode("\n", $code_lines);
	return $code	;

}


/**
 * Generates a reference to the given variable inside the given (possibly nested)
 * block namespace. This is a string of the form:
 * ' . $this->_tpldata['parent'][$_parent_i]['$child1'][$_child1_i]['$child2'][$_child2_i]...['varname'] . '
 * It's ready to be inserted into an "echo" line in one of the templates.
 * NOTE: expects a trailing "." on the namespace.
 */
function generate_block_varref($namespace, $varname)
{
	// Strip the trailing period.
	$namespace = substr($namespace, 0, strlen($namespace) - 1);

	// Get a reference to the data block for this namespace.
	$varref = $this->generate_block_data_ref($namespace, true);
	// Prepend the necessary code to stick this in an echo line.

	// Append the variable reference.
	$varref .= '[\'' . $varname . '\']';

	$varref = '\' . ( ( isset(' . $varref . ') ) ? ' . $varref . ' : \'\' ) . \'';

	return $varref;

}

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.