<?php
/**
 * Smarty Internal Plugin Compile Include PHP
 *
 * Compiles the {include_php} tag
 *
 * @package Smarty
 * @subpackage Compiler
 * @author Uwe Tews
 */

/**
 * Smarty Internal Plugin Compile Insert Class
 *
 * @package Smarty
 * @subpackage Compiler
 */
class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase {

	/**
	 * Attribute definition: Overwrites base class.
	 *
	 * @var array
	 * @see Smarty_Internal_CompileBase
	 */
	public $required_attributes = array('file');
	/**
	 * Attribute definition: Overwrites base class.
	 *
	 * @var array
	 * @see Smarty_Internal_CompileBase
	 */
	public $shorttag_order = array('file');
	/**
	 * Attribute definition: Overwrites base class.
	 *
	 * @var array
	 * @see Smarty_Internal_CompileBase
	 */
	public $optional_attributes = array('once', 'assign');

	/**
	 * Compiles code for the {include_php} tag
	 *
	 * @param array  $args     array with attributes from parser
	 * @param object $compiler compiler object
	 * @return string compiled code
	 */
	public function compile($args, $compiler)
	{
		if (!($compiler->smarty instanceof SmartyBC)) {
			throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable");
		}
		// check and get attributes
		$_attr = $this->getAttributes($compiler, $args);

		$_output = '<?php ';

		$_smarty_tpl = $compiler->template;
		$_filepath = false;
		eval('$_file = ' . $_attr['file'] . ';');
		if (!isset($compiler->smarty->security_policy) && file_exists($_file)) {
			$_filepath = $_file;
		} else {
			if (isset($compiler->smarty->security_policy)) {
				$_dir = $compiler->smarty->security_policy->trusted_dir;
			} else {
				$_dir = $compiler->smarty->trusted_dir;
			}
			if (!empty($_dir)) {
				foreach((array)$_dir as $_script_dir) {
					$_script_dir = rtrim($_script_dir, '/\\') . DS;
					if (file_exists($_script_dir . $_file)) {
						$_filepath = $_script_dir .  $_file;
						break;
					}
				}
			}
		}
		if ($_filepath == false) {
			$compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", $compiler->lex->taglineno);
		}

		if (isset($compiler->smarty->security_policy)) {
			$compiler->smarty->security_policy->isTrustedPHPDir($_filepath);
		}

		if (isset($_attr['assign'])) {
			// output will be stored in a smarty variable instead of being displayed
			$_assign = $_attr['assign'];
		}
		$_once = '_once';
		if (isset($_attr['once'])) {
			if ($_attr['once'] == 'false') {
				$_once = '';
			}
		}

		if (isset($_assign)) {
			return "<?php ob_start(); include{$_once} ('{$_filepath}'); \$_smarty_tpl->assign({$_assign},ob_get_contents()); ob_end_clean();?>";
		} else {
			return "<?php include{$_once} ('{$_filepath}');?>\n";
		}
	}

}

?>