Jump to content

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;

}

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.