diff --git a/Smarty.class.php b/Smarty.class.php index ca1ceaff..889fd0d5 100644 --- a/Smarty.class.php +++ b/Smarty.class.php @@ -47,33 +47,29 @@ class Smarty var $compile_dir = "./templates_c"; // name of directory for compiled templates var $config_dir = "./configs"; // directory where config files are located - var $global_assign = array( 'SCRIPT_NAME' ); // variables from the GLOBALS array - // that are implicitly assigned - // to all templates + var $global_assign = array('SCRIPT_NAME'); // variables from the GLOBALS array + // that are implicitly assigned + // to all templates var $compile_check = true; // whether to check for compiling step or not: // This is generally set to false once the // application is entered into production and // initially compiled. Leave set to true - // during development. true/false + // during development. true/false default true. var $force_compile = false; // force templates to compile every time. - // overrides compile_check. true/false - - // NOTE: all cache directives override - // compiling directives. If a cached version - // is available, that will be used regardless - // of compile settings. + // if cache file exists, this will + // override compile_check and force_compile. + // true/false. default false. var $caching = false; // whether to use caching or not. true/false var $cache_dir = "./cache"; // name of directory for template cache var $cache_lifetime = 3600; // number of seconds cached content will persist. // 0 = never expires. default is one hour (3600) - - - var $tpl_file_ext = ".tpl"; // template files extention + + var $tpl_file_ext = ".tpl"; // template file extention var $allow_php = false; // whether or not to allow embedded php // in the templates. By default, php tags - // are escaped. true/false + // are escaped. true/false. default false. var $left_delimiter = "{"; // template tag delimiters. var $right_delimiter = "}"; @@ -239,7 +235,34 @@ class Smarty } return true; } + +/*======================================================================*\ + Function: is_cached() + Purpose: test to see if valid cache exists for this template +\*======================================================================*/ + + function is_cached($tpl_file) + { + global $PHP_SELF; + + // cache id = template path + the invoked script + $cache_tpl_md5 = md5($tpl_file); + $cache_path_md5 = md5($PHP_SELF); + $cache_path_dir = substr($cache_path_md5,0,2); + $cache_file = $this->cache_dir."/".$cache_tpl_md5."/$cache_path_dir/$cache_tpl_md5"."_"."$cache_path_md5.cache"; + + if(!$this->cache_force && + (file_exists($cache_file) && + ($this->cache_lifetime == 0 || + (mktime() - filemtime($cache_file) <= $this->cache_lifetime) + ))) + return true; + else + return false; + + } + /*======================================================================*\ Function: clear_all_assign() Purpose: clear all the assigned template variables. @@ -282,7 +305,11 @@ class Smarty if($this->caching) { // cache id = template path + the invoked script - $cache_file = $this->cache_dir."/".urlencode($tpl_file."@".$PHP_SELF).".cache"; + $cache_tpl_md5 = md5($tpl_file); + $cache_path_md5 = md5($PHP_SELF); + $cache_path_dir = substr($cache_path_md5,0,2); + $cache_file = $this->cache_dir."/".$cache_tpl_md5."/$cache_path_dir/$cache_tpl_md5"."_"."$cache_path_md5.cache"; + if(!$this->cache_force && (file_exists($cache_file) && ($this->cache_lifetime == 0 || @@ -317,7 +344,7 @@ class Smarty } if($this->caching) { - $this->_write_file($cache_file, $results); + $this->_write_file($cache_file, $results, true); $results = $this->_process_cached_inserts($results); } @@ -1179,8 +1206,39 @@ class Smarty Purpose: write out a file \*======================================================================*/ - function _write_file($filename,$contents) + function _write_file($filename,$contents,$create_dirs=false) { + if($create_dirs) { + $filename_split = split("\/+",$filename); + foreach($filename_split as $curr_dir) { + if(empty($curr_dir)) { + if(empty($dir_sum)) + $dir_sum = "/"; + continue; + } + + if($curr_dir == ".." || $curr_dir == ".") { + $dir_sum .= $curr_dir."/"; + continue; + } + + if(substr($curr_dir,-6) == ".cache") + break; + + if(empty($dir_sum)) + $dir_sum .= $curr_dir; + else + $dir_sum .= "/".$curr_dir; + + if(is_dir($dir_sum)) + continue; + if(file_exists($dir_sum)) + continue; + + mkdir($dir_sum,0755); + } + } + if(!($fd = fopen($filename, 'w'))) { $this->_set_error_msg("problem writing '$filename.'"); return false; @@ -1188,8 +1246,8 @@ class Smarty fwrite($fd, $contents); fclose($fd); return true; - } - + } + /*======================================================================*\ Function: _set_error_msg() Purpose: set the error message diff --git a/docs.sgml b/docs.sgml index c8adabd7..72228cdc 100644 --- a/docs.sgml +++ b/docs.sgml @@ -441,6 +441,21 @@ chmod 700 cache 1.3.0. + + is_cached + + + void is_cached + stringtemplate + + + + This returns true if there is a valid cache for this template. + Use this to skip process-intensive tasks that aren't necessary + when a cached version of the template is available. This was + added to Smarty 1.3.0. + + get_template_vars @@ -488,23 +503,30 @@ chmod 700 cache include("Smarty.class.php"); $smarty = new Smarty; -// dummy up some data -$address = "245 N 50th"; -$db_data = array( - "City" => "Lincoln", - "State" => "Nebraska", - "Zip" = > "68502" - ); -$smarty->assign("Name","Fred"); -$smarty->assign("Address",$address); -$smarty->assign($db_data); +// only do db calls if cache doesn't exist +if(!$smarty->is_cached("index.tpl")) +{ + + // dummy up some data + $address = "245 N 50th"; + $db_data = array( + "City" => "Lincoln", + "State" => "Nebraska", + "Zip" = > "68502" + ); + + $smarty->assign("Name","Fred"); + $smarty->assign("Address",$address); + $smarty->assign($db_data); + +} // display the output $smarty->display("index.tpl"); // alternatively capture the output -$output = $smarty->fetch("index.tpl"); +// $output = $smarty->fetch("index.tpl"); diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php index ca1ceaff..889fd0d5 100644 --- a/libs/Smarty.class.php +++ b/libs/Smarty.class.php @@ -47,33 +47,29 @@ class Smarty var $compile_dir = "./templates_c"; // name of directory for compiled templates var $config_dir = "./configs"; // directory where config files are located - var $global_assign = array( 'SCRIPT_NAME' ); // variables from the GLOBALS array - // that are implicitly assigned - // to all templates + var $global_assign = array('SCRIPT_NAME'); // variables from the GLOBALS array + // that are implicitly assigned + // to all templates var $compile_check = true; // whether to check for compiling step or not: // This is generally set to false once the // application is entered into production and // initially compiled. Leave set to true - // during development. true/false + // during development. true/false default true. var $force_compile = false; // force templates to compile every time. - // overrides compile_check. true/false - - // NOTE: all cache directives override - // compiling directives. If a cached version - // is available, that will be used regardless - // of compile settings. + // if cache file exists, this will + // override compile_check and force_compile. + // true/false. default false. var $caching = false; // whether to use caching or not. true/false var $cache_dir = "./cache"; // name of directory for template cache var $cache_lifetime = 3600; // number of seconds cached content will persist. // 0 = never expires. default is one hour (3600) - - - var $tpl_file_ext = ".tpl"; // template files extention + + var $tpl_file_ext = ".tpl"; // template file extention var $allow_php = false; // whether or not to allow embedded php // in the templates. By default, php tags - // are escaped. true/false + // are escaped. true/false. default false. var $left_delimiter = "{"; // template tag delimiters. var $right_delimiter = "}"; @@ -239,7 +235,34 @@ class Smarty } return true; } + +/*======================================================================*\ + Function: is_cached() + Purpose: test to see if valid cache exists for this template +\*======================================================================*/ + + function is_cached($tpl_file) + { + global $PHP_SELF; + + // cache id = template path + the invoked script + $cache_tpl_md5 = md5($tpl_file); + $cache_path_md5 = md5($PHP_SELF); + $cache_path_dir = substr($cache_path_md5,0,2); + $cache_file = $this->cache_dir."/".$cache_tpl_md5."/$cache_path_dir/$cache_tpl_md5"."_"."$cache_path_md5.cache"; + + if(!$this->cache_force && + (file_exists($cache_file) && + ($this->cache_lifetime == 0 || + (mktime() - filemtime($cache_file) <= $this->cache_lifetime) + ))) + return true; + else + return false; + + } + /*======================================================================*\ Function: clear_all_assign() Purpose: clear all the assigned template variables. @@ -282,7 +305,11 @@ class Smarty if($this->caching) { // cache id = template path + the invoked script - $cache_file = $this->cache_dir."/".urlencode($tpl_file."@".$PHP_SELF).".cache"; + $cache_tpl_md5 = md5($tpl_file); + $cache_path_md5 = md5($PHP_SELF); + $cache_path_dir = substr($cache_path_md5,0,2); + $cache_file = $this->cache_dir."/".$cache_tpl_md5."/$cache_path_dir/$cache_tpl_md5"."_"."$cache_path_md5.cache"; + if(!$this->cache_force && (file_exists($cache_file) && ($this->cache_lifetime == 0 || @@ -317,7 +344,7 @@ class Smarty } if($this->caching) { - $this->_write_file($cache_file, $results); + $this->_write_file($cache_file, $results, true); $results = $this->_process_cached_inserts($results); } @@ -1179,8 +1206,39 @@ class Smarty Purpose: write out a file \*======================================================================*/ - function _write_file($filename,$contents) + function _write_file($filename,$contents,$create_dirs=false) { + if($create_dirs) { + $filename_split = split("\/+",$filename); + foreach($filename_split as $curr_dir) { + if(empty($curr_dir)) { + if(empty($dir_sum)) + $dir_sum = "/"; + continue; + } + + if($curr_dir == ".." || $curr_dir == ".") { + $dir_sum .= $curr_dir."/"; + continue; + } + + if(substr($curr_dir,-6) == ".cache") + break; + + if(empty($dir_sum)) + $dir_sum .= $curr_dir; + else + $dir_sum .= "/".$curr_dir; + + if(is_dir($dir_sum)) + continue; + if(file_exists($dir_sum)) + continue; + + mkdir($dir_sum,0755); + } + } + if(!($fd = fopen($filename, 'w'))) { $this->_set_error_msg("problem writing '$filename.'"); return false; @@ -1188,8 +1246,8 @@ class Smarty fwrite($fd, $contents); fclose($fd); return true; - } - + } + /*======================================================================*\ Function: _set_error_msg() Purpose: set the error message