Re: [SMARTY-DEV] Incline inclusion

From: Date: Tue, 23 Jul 2002 03:12:57 +0000
Subject: Re: [SMARTY-DEV] Incline inclusion
References: 1  Groups: php.smarty.dev 
Request: Send a blank email to php-smarty-dev+get-217@lists.php.net to get a copy of this message
Whoops, had a bug which overwrote the _tpl_vars with each child include. Also noticed that for most people this will create a new smarty object for each included file. Didnt notice this at first because our object factory uses a pool to cache the objects it creates. The performance difference between using the pool and dynamic object creation was minute and shouldnt be an issue. /*======================================================================*\ Function: _compile_include_tag Purpose: Compile {include ...} tag \*======================================================================*/ function _compile_include_tag($tag_args) { $attrs = $this->_parse_attrs($tag_args); $arg_list = array(); if (empty($attrs['file'])) { $this->_syntax_error("missing 'file' attribute in include tag"); } foreach ($attrs as $arg_name => $arg_value) { switch ($arg_name) { case 'file': $include_file = $arg_value; break; case 'assign': $assign_var = $arg_value; break; case 'inline': $inline = true; $_smarty_tpl_vars = $this->_tpl_vars; break; case 'cache_id': $cache_id = preg_replace('!\'|"!', '', $arg_value); break; case 'compile_id': $compile_id = preg_replace('!\'|"!', '', $arg_value); break; default: if (true === $inline) { $this->_tpl_vars[$arg_name] = preg_replace('!\'|"!', '', $arg_value); } else { if (is_bool($arg_value)) $arg_value = $arg_value ? 'true' : 'false'; $arg_list[] = "'$arg_name' => $arg_value"; } break; } } if (true !== $inline) { $output = '<?php '; if (isset($assign_var)) { $output .= "ob_start();\n"; } $output .= "\$_smarty_tpl_vars = \$this->_tpl_vars;\n" . "\$this->_smarty_include(".$include_file.", array(".implode(',', (array)$arg_list)."));\n" . "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" . "unset(\$_smarty_tpl_vars);\n"; if (isset($assign_var)) { $output .= "<? \$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n?>"; } $output .= ' ?>'; } else { $force_compile = $this->force_compile; $this->force_compile = true; $output .= $this->fetch(preg_replace('!\'|"!', '', $include_file), $cache_id, $compile_id); $this->force_compile = $force_compile; $this->_tpl_vars = $_smarty_tpl_vars; unset($_smarty_tpl_vars); } return $output; } ----- Original Message ----- From: "Bob Silva" <bob@bravenet.com> To: <smarty-dev@lists.php.net> Sent: Monday, July 22, 2002 6:00 PM Subject: [SMARTY-DEV] Incline inclusion Sorry if this post shows up twice...sent the first one from the news interface and it never showed (yet). Would like to propose a method to include files inline (instead of translating them into a php include call). We are lucky enough at Bravenet to have a site-wide Zend Accelerator license, so having a whack of includes isnt a big worry of ours. However our site design is based on components (some deeply nested) and some pages were upwards of 10-15 included files just to build the page with Smarty and our design goals. To work around this, I added a parameter to the {include} directive to include the compiled file output inline into the compilation of the including page. This will have a minimal impact on the compiling performance, but should have significant improvements for busier sites. File: index.tpl {include file="header.tpl"} {include file="navbar.tpl"} Content of index page {include file="footer.tpl"} File: navbar.tpl {include file="search_component.tpl"} {include file="whatsnew_component.tpl"} {include file="something_else"} This is a simple example, but that would require at a minimum, 6 included files to build the page (plus 2 more for the smarty libraries, plus whatever other libraries you have in your framework.....adds up fast and makes a difference in page processing times if your load is high enough). The biggest drawback to this inline method is that you lose the auto-compilation if a child changes. To recognize changes in a child include (doesnt matter how deep), you would need to modify the top-level parent to get the children to recompile. Just an idea I thought might be useful for larger sites looking for every ounce of performance they can get. /*======================================================================*\ Function: _compile_include_tag Purpose: Compile {include ...} tag \*======================================================================*/ function _compile_include_tag($tag_args) { $attrs = $this->_parse_attrs($tag_args); $arg_list = array(); if (empty($attrs['file'])) { $this->_syntax_error("missing 'file' attribute in include tag"); } foreach ($attrs as $arg_name => $arg_value) { switch ($arg_name) { case 'file': $include_file = $arg_value; break; case 'assign': $assign_var = $arg_value; break; case 'inline': $inline = true; break; case 'cache_id': $cache_id = $arg_value; break; case 'compile_id': $compile_id = $arg_value; break; default: if (true === $inline) { $_smarty_tpl_vars = $this->_tpl_vars; $this->_tpl_vars[$arg_name] = preg_replace('!\'|"!', '', $arg_value); } else { if (is_bool($arg_value)) $arg_value = $arg_value ? 'true' : 'false'; $arg_list[] = "'$arg_name' => $arg_value"; } break; } } if (true !== $inline) { $output = '<?php '; if (isset($assign_var)) { $output .= "ob_start();\n"; } $output .= "\$_smarty_tpl_vars = \$this->_tpl_vars;\n" . "\$this->_smarty_include(".$include_file.", array(".implode(',', (array)$arg_list)."));\n" . "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" . "unset(\$_smarty_tpl_vars);\n"; if (isset($assign_var)) { $output .= "<? \$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n?>"; } $output .= ' ?>'; } else { $force_compile = $this->force_compile; $this->force_compile = true; $output .= $this->fetch(preg_replace('!\'|"!', '', $include_file), $cache_id, $compile_id); $this->force_compile = $force_compile; $this->_tpl_vars = $_smarty_tpl_vars; unset($_smarty_tpl_vars); } return $output; }

« previous php.smarty.dev (#217) next »