- compile_id changes

This commit is contained in:
andrey
2001-08-31 03:33:41 +00:00
parent 2c2e4b1c0b
commit fde4fb602f
2 changed files with 178 additions and 226 deletions

View File

@@ -194,6 +194,7 @@ class Smarty
var $_extract = false; // flag for custom functions var $_extract = false; // flag for custom functions
var $_included_tpls = array(); // list of run-time included templates var $_included_tpls = array(); // list of run-time included templates
var $_inclusion_depth = 0; // current template inclusion depth var $_inclusion_depth = 0; // current template inclusion depth
var $_compile_id = null; // for different compiled templates
var $_smarty_debug_id = 'SMARTY_DEBUG'; // id in query string to turn on debug mode var $_smarty_debug_id = 'SMARTY_DEBUG'; // id in query string to turn on debug mode
@@ -382,21 +383,9 @@ class Smarty
Function: clear_cache() Function: clear_cache()
Purpose: clear cached content for the given template and cache id Purpose: clear cached content for the given template and cache id
\*======================================================================*/ \*======================================================================*/
function clear_cache($tpl_file, $cache_id = null) function clear_cache($tpl_file = null, $cache_id = null, $compile_id)
{ {
$cache_tpl_md5 = md5(realpath($this->template_dir.'/'.$tpl_file)); return $this->_rm_auto($this->cache_dir, $tpl_file, $compile_id . $cache_id);
$cache_dir = $this->cache_dir.'/'.$cache_tpl_md5;
if (!is_dir($cache_dir))
return false;
if (isset($cache_id)) {
$cache_id_md5 = md5($cache_id);
$cache_id_dir = substr($cache_id_md5, 0, 2);
$cache_file = "$cache_dir/$cache_id_dir/{$cache_tpl_md5}_$cache_id_md5.cache";
return (bool)(is_file($cache_file) && unlink($cache_file));
} else
return $this->_clear_tpl_cache_dir($cache_tpl_md5);
} }
@@ -406,20 +395,7 @@ class Smarty
\*======================================================================*/ \*======================================================================*/
function clear_all_cache() function clear_all_cache()
{ {
if (!is_dir($this->cache_dir)) return $this->_rm_auto($this->cache_dir);
return false;
$dir_handle = opendir($this->cache_dir);
while ($curr_dir = readdir($dir_handle)) {
if ($curr_dir == '.' || $curr_dir == '..' ||
!is_dir($this->cache_dir.'/'.$curr_dir))
continue;
$this->_clear_tpl_cache_dir($curr_dir);
}
closedir($dir_handle);
return true;
} }
@@ -427,16 +403,12 @@ class Smarty
Function: is_cached() Function: is_cached()
Purpose: test to see if valid cache exists for this template Purpose: test to see if valid cache exists for this template
\*======================================================================*/ \*======================================================================*/
function is_cached($tpl_file, $cache_id = null) function is_cached($tpl_file, $cache_id = null, $compile_id = null)
{ {
if (!$this->caching) if (!$this->caching)
return false; return false;
// cache name = template path + cache_id $cache_file = $this->_get_auto_filename($this->cache_dir, $tpl_file, $compile_id . $cache_id);
$cache_tpl_md5 = md5(realpath($this->template_dir.'/'.$tpl_file));
$cache_id_md5 = md5($cache_id);
$cache_id_dir = substr($cache_id_md5, 0, 2);
$cache_file = $this->cache_dir."/$cache_tpl_md5/$cache_id_dir/{$cache_tpl_md5}_$cache_id_md5.cache";
if (file_exists($cache_file) && if (file_exists($cache_file) &&
($this->cache_lifetime == 0 || ($this->cache_lifetime == 0 ||
@@ -458,36 +430,14 @@ class Smarty
} }
/*======================================================================*\ /*======================================================================*\
Function: clear_compile_dir() Function: clear_compiled_tpl()
Purpose: clears compiled version of specified template resource, Purpose: clears compiled version of specified template resource,
or all compiled template files if one is not specified. or all compiled template files if one is not specified.
This function is for advanced use only, not normally needed. This function is for advanced use only, not normally needed.
\*======================================================================*/ \*======================================================================*/
function clear_compile_dir($tpl_file = null) function clear_compile_tpl($tpl_file = null, $compile_id = null)
{ {
if (!is_dir($this->compile_dir)) return $this->_rm_auto($this->compile_dir, $tpl_file, $compile_id);
return false;
if (isset($tpl_file)) {
// remove compiled template file if it exists
$tpl_file = urlencode($tpl_file).'.php';
if (file_exists($this->compile_dir.'/'.$tpl_file)) {
unlink($this->compile_dir.'/'.$tpl_file);
}
} else {
// remove everything in $compile_dir
$dir_handle = opendir($this->compile_dir);
while ($curr_file = readdir($dir_handle)) {
if ($curr_file == '.' || $curr_dir == '..' ||
!is_file($this->compile_dir.'/'.$curr_file)) {
continue;
}
unlink($this->compile_dir.'/'.$curr_file);
}
closedir($dir_handle);
}
return true;
} }
/*======================================================================*\ /*======================================================================*\
@@ -504,19 +454,20 @@ class Smarty
Function: display() Function: display()
Purpose: executes & displays the template results Purpose: executes & displays the template results
\*======================================================================*/ \*======================================================================*/
function display($tpl_file, $cache_id = null) function display($tpl_file, $cache_id = null, $compile_id = null)
{ {
$this->fetch($tpl_file, $cache_id, true); $this->fetch($tpl_file, $cache_id, $compile_id, true);
} }
/*======================================================================*\ /*======================================================================*\
Function: fetch() Function: fetch()
Purpose: executes & returns or displays the template results Purpose: executes & returns or displays the template results
\*======================================================================*/ \*======================================================================*/
function fetch($tpl_file, $cache_id = null, $display = false) function fetch($tpl_file, $cache_id = null, $compile_id = null, $display = false)
{ {
global $HTTP_SERVER_VARS, $QUERY_STRING, $HTTP_COOKIE_VARS; global $HTTP_SERVER_VARS, $QUERY_STRING, $HTTP_COOKIE_VARS;
$this->_compile_id = $compile_id;
$this->_inclusion_depth = 0; $this->_inclusion_depth = 0;
$this->_included_tpls = array(); $this->_included_tpls = array();
@@ -524,11 +475,7 @@ class Smarty
'depth' => 0); 'depth' => 0);
if ($this->caching) { if ($this->caching) {
// cache name = template path + cache_id $cache_file = $this->_get_auto_filename($this->cache_dir, $tpl_file, $compile_id . $cache_id);
$cache_tpl_md5 = md5(realpath($this->template_dir.'/'.$tpl_file));
$cache_id_md5 = md5($cache_id);
$cache_id_dir = substr($cache_id_md5, 0, 2);
$cache_file = $this->cache_dir."/$cache_tpl_md5/$cache_id_dir/{$cache_tpl_md5}_$cache_id_md5.cache";
if (file_exists($cache_file) && if (file_exists($cache_file) &&
($this->cache_lifetime == 0 || ($this->cache_lifetime == 0 ||
@@ -678,7 +625,7 @@ function _generate_debug_output() {
function _process_template($tpl_file, &$compile_path) function _process_template($tpl_file, &$compile_path)
{ {
// get path to where compiled template is (to be) saved // get path to where compiled template is (to be) saved
$this->_fetch_compile_path($tpl_file, $compile_path); $compile_path = $this->_get_auto_filename($this->compile_dir, $tpl_file, $this->_compile_id);
// test if template needs to be compiled // test if template needs to be compiled
if (!$this->force_compile && $this->_compiled_template_exists($compile_path)) { if (!$this->force_compile && $this->_compiled_template_exists($compile_path)) {
@@ -711,17 +658,6 @@ function _generate_debug_output() {
} }
} }
/*======================================================================*\
Function: _fetch_compile_path()
Purpose: fetch the path to save the comiled template
\*======================================================================*/
function _fetch_compile_path($tpl_file, &$compile_path)
{
// everything is in $compile_dir
$compile_path = $this->compile_dir.'/'.urlencode($tpl_file).'.php';
return true;
}
/*======================================================================*\ /*======================================================================*\
Function: _compiled_template_exists Function: _compiled_template_exists
Purpose: Purpose:
@@ -749,7 +685,7 @@ function _generate_debug_output() {
function _write_compiled_template($compile_path, $template_compiled) function _write_compiled_template($compile_path, $template_compiled)
{ {
// we save everything into $compile_dir // we save everything into $compile_dir
$this->_write_file($compile_path, $template_compiled); $this->_write_file($compile_path, $template_compiled, true);
return true; return true;
} }
@@ -872,8 +808,7 @@ function _generate_debug_output() {
array_unshift($this->_config, $this->_config[0]); array_unshift($this->_config, $this->_config[0]);
if($this->_process_template($_smarty_include_tpl_file, $compile_path)) if ($this->_process_template($_smarty_include_tpl_file, $compile_path, $compile_id)) {
{
if ($this->show_info_include) { if ($this->show_info_include) {
echo "\n<!-- SMARTY_BEGIN: ".$_smarty_include_tpl_file." -->\n"; echo "\n<!-- SMARTY_BEGIN: ".$_smarty_include_tpl_file." -->\n";
} }
@@ -1039,37 +974,78 @@ function _run_mod_handler()
} }
/*======================================================================*\ /*======================================================================*\
Function: _clear_tpl_cache_dir Function: _get_auto_base
Purpose: Clear the specified template cache Purpose: Get a base name for automatic files creation
\*======================================================================*/ \*======================================================================*/
function _clear_tpl_cache_dir($cache_tpl_md5) function _get_auto_base($auto_base, $auto_source)
{ {
$cache_dir = $this->cache_dir.'/'.$cache_tpl_md5; $source_md5 = md5($auto_source);
if (!is_dir($cache_dir)) $res = $auto_base . '/' . substr($source_md5, 0, 2) . '/' . $source_md5;
return $res;
}
/*======================================================================*\
Function: _get_auto_filename
Purpose: get a concrete filename for automagically created content
\*======================================================================*/
function _get_auto_filename($auto_base, $auto_source, $auto_id = null)
{
$res = $this->_get_auto_base($auto_base, $auto_source) .
'/' . md5($auto_id) . '.php';
return $res;
}
/*======================================================================*\
Function: _rm_auto
Purpose: delete an automagically created file by name and id
\*======================================================================*/
function _rm_auto($auto_base, $auto_source = null, $auto_id = null)
{
if (!is_dir($auto_base))
return false; return false;
$dir_handle = opendir($cache_dir); if (!isset($auto_source)) {
while ($curr_dir = readdir($dir_handle)) { $res = $this->_rmdir($auto_base, 0);
$cache_path_dir = $cache_dir.'/'.$curr_dir; } else {
if ($curr_dir == '.' || $curr_dir == '..' || if (isset($auto_id)) {
!is_dir($cache_path_dir)) $tname = $this->_get_auto_filename($auto_base, $auto_source, $auto_id);
continue; $res = is_file($tname) && unlink( $tname);
} else {
$dir_handle2 = opendir($cache_path_dir); $tname = $this->_get_auto_base($auto_base, $auto_source);
while ($curr_file = readdir($dir_handle2)) { $res = $this->_rmdir($tname);
if ($curr_file == '.' || $curr_file == '..')
continue;
$cache_file = $cache_path_dir.'/'.$curr_file;
if (is_file($cache_file))
unlink($cache_file);
} }
closedir($dir_handle2);
@rmdir($cache_path_dir);
} }
closedir($dir_handle);
@rmdir($cache_dir); return $res;
}
/*======================================================================*\
Function: _rmdir
Purpose: delete a dir recursively (level=0 -> keep root)
WARNING: no security whatsoever!!
\*======================================================================*/
function _rmdir($dirname, $level = 1)
{
$handle = opendir($dirname);
while ($entry = readdir($handle)) {
if ($entry != '.' && $entry != '..') {
if (is_dir($dirname . '/' . $entry)) {
$this->_rmdir($dirname . '/' . $entry, $level + 1);
}
else {
unlink($dirname . '/' . $entry);
}
}
}
closedir($handle);
if ($level)
rmdir($dirname);
return true; return true;
} }

View File

@@ -194,6 +194,7 @@ class Smarty
var $_extract = false; // flag for custom functions var $_extract = false; // flag for custom functions
var $_included_tpls = array(); // list of run-time included templates var $_included_tpls = array(); // list of run-time included templates
var $_inclusion_depth = 0; // current template inclusion depth var $_inclusion_depth = 0; // current template inclusion depth
var $_compile_id = null; // for different compiled templates
var $_smarty_debug_id = 'SMARTY_DEBUG'; // id in query string to turn on debug mode var $_smarty_debug_id = 'SMARTY_DEBUG'; // id in query string to turn on debug mode
@@ -382,21 +383,9 @@ class Smarty
Function: clear_cache() Function: clear_cache()
Purpose: clear cached content for the given template and cache id Purpose: clear cached content for the given template and cache id
\*======================================================================*/ \*======================================================================*/
function clear_cache($tpl_file, $cache_id = null) function clear_cache($tpl_file = null, $cache_id = null, $compile_id)
{ {
$cache_tpl_md5 = md5(realpath($this->template_dir.'/'.$tpl_file)); return $this->_rm_auto($this->cache_dir, $tpl_file, $compile_id . $cache_id);
$cache_dir = $this->cache_dir.'/'.$cache_tpl_md5;
if (!is_dir($cache_dir))
return false;
if (isset($cache_id)) {
$cache_id_md5 = md5($cache_id);
$cache_id_dir = substr($cache_id_md5, 0, 2);
$cache_file = "$cache_dir/$cache_id_dir/{$cache_tpl_md5}_$cache_id_md5.cache";
return (bool)(is_file($cache_file) && unlink($cache_file));
} else
return $this->_clear_tpl_cache_dir($cache_tpl_md5);
} }
@@ -406,20 +395,7 @@ class Smarty
\*======================================================================*/ \*======================================================================*/
function clear_all_cache() function clear_all_cache()
{ {
if (!is_dir($this->cache_dir)) return $this->_rm_auto($this->cache_dir);
return false;
$dir_handle = opendir($this->cache_dir);
while ($curr_dir = readdir($dir_handle)) {
if ($curr_dir == '.' || $curr_dir == '..' ||
!is_dir($this->cache_dir.'/'.$curr_dir))
continue;
$this->_clear_tpl_cache_dir($curr_dir);
}
closedir($dir_handle);
return true;
} }
@@ -427,16 +403,12 @@ class Smarty
Function: is_cached() Function: is_cached()
Purpose: test to see if valid cache exists for this template Purpose: test to see if valid cache exists for this template
\*======================================================================*/ \*======================================================================*/
function is_cached($tpl_file, $cache_id = null) function is_cached($tpl_file, $cache_id = null, $compile_id = null)
{ {
if (!$this->caching) if (!$this->caching)
return false; return false;
// cache name = template path + cache_id $cache_file = $this->_get_auto_filename($this->cache_dir, $tpl_file, $compile_id . $cache_id);
$cache_tpl_md5 = md5(realpath($this->template_dir.'/'.$tpl_file));
$cache_id_md5 = md5($cache_id);
$cache_id_dir = substr($cache_id_md5, 0, 2);
$cache_file = $this->cache_dir."/$cache_tpl_md5/$cache_id_dir/{$cache_tpl_md5}_$cache_id_md5.cache";
if (file_exists($cache_file) && if (file_exists($cache_file) &&
($this->cache_lifetime == 0 || ($this->cache_lifetime == 0 ||
@@ -458,36 +430,14 @@ class Smarty
} }
/*======================================================================*\ /*======================================================================*\
Function: clear_compile_dir() Function: clear_compiled_tpl()
Purpose: clears compiled version of specified template resource, Purpose: clears compiled version of specified template resource,
or all compiled template files if one is not specified. or all compiled template files if one is not specified.
This function is for advanced use only, not normally needed. This function is for advanced use only, not normally needed.
\*======================================================================*/ \*======================================================================*/
function clear_compile_dir($tpl_file = null) function clear_compile_tpl($tpl_file = null, $compile_id = null)
{ {
if (!is_dir($this->compile_dir)) return $this->_rm_auto($this->compile_dir, $tpl_file, $compile_id);
return false;
if (isset($tpl_file)) {
// remove compiled template file if it exists
$tpl_file = urlencode($tpl_file).'.php';
if (file_exists($this->compile_dir.'/'.$tpl_file)) {
unlink($this->compile_dir.'/'.$tpl_file);
}
} else {
// remove everything in $compile_dir
$dir_handle = opendir($this->compile_dir);
while ($curr_file = readdir($dir_handle)) {
if ($curr_file == '.' || $curr_dir == '..' ||
!is_file($this->compile_dir.'/'.$curr_file)) {
continue;
}
unlink($this->compile_dir.'/'.$curr_file);
}
closedir($dir_handle);
}
return true;
} }
/*======================================================================*\ /*======================================================================*\
@@ -504,19 +454,20 @@ class Smarty
Function: display() Function: display()
Purpose: executes & displays the template results Purpose: executes & displays the template results
\*======================================================================*/ \*======================================================================*/
function display($tpl_file, $cache_id = null) function display($tpl_file, $cache_id = null, $compile_id = null)
{ {
$this->fetch($tpl_file, $cache_id, true); $this->fetch($tpl_file, $cache_id, $compile_id, true);
} }
/*======================================================================*\ /*======================================================================*\
Function: fetch() Function: fetch()
Purpose: executes & returns or displays the template results Purpose: executes & returns or displays the template results
\*======================================================================*/ \*======================================================================*/
function fetch($tpl_file, $cache_id = null, $display = false) function fetch($tpl_file, $cache_id = null, $compile_id = null, $display = false)
{ {
global $HTTP_SERVER_VARS, $QUERY_STRING, $HTTP_COOKIE_VARS; global $HTTP_SERVER_VARS, $QUERY_STRING, $HTTP_COOKIE_VARS;
$this->_compile_id = $compile_id;
$this->_inclusion_depth = 0; $this->_inclusion_depth = 0;
$this->_included_tpls = array(); $this->_included_tpls = array();
@@ -524,11 +475,7 @@ class Smarty
'depth' => 0); 'depth' => 0);
if ($this->caching) { if ($this->caching) {
// cache name = template path + cache_id $cache_file = $this->_get_auto_filename($this->cache_dir, $tpl_file, $compile_id . $cache_id);
$cache_tpl_md5 = md5(realpath($this->template_dir.'/'.$tpl_file));
$cache_id_md5 = md5($cache_id);
$cache_id_dir = substr($cache_id_md5, 0, 2);
$cache_file = $this->cache_dir."/$cache_tpl_md5/$cache_id_dir/{$cache_tpl_md5}_$cache_id_md5.cache";
if (file_exists($cache_file) && if (file_exists($cache_file) &&
($this->cache_lifetime == 0 || ($this->cache_lifetime == 0 ||
@@ -678,7 +625,7 @@ function _generate_debug_output() {
function _process_template($tpl_file, &$compile_path) function _process_template($tpl_file, &$compile_path)
{ {
// get path to where compiled template is (to be) saved // get path to where compiled template is (to be) saved
$this->_fetch_compile_path($tpl_file, $compile_path); $compile_path = $this->_get_auto_filename($this->compile_dir, $tpl_file, $this->_compile_id);
// test if template needs to be compiled // test if template needs to be compiled
if (!$this->force_compile && $this->_compiled_template_exists($compile_path)) { if (!$this->force_compile && $this->_compiled_template_exists($compile_path)) {
@@ -711,17 +658,6 @@ function _generate_debug_output() {
} }
} }
/*======================================================================*\
Function: _fetch_compile_path()
Purpose: fetch the path to save the comiled template
\*======================================================================*/
function _fetch_compile_path($tpl_file, &$compile_path)
{
// everything is in $compile_dir
$compile_path = $this->compile_dir.'/'.urlencode($tpl_file).'.php';
return true;
}
/*======================================================================*\ /*======================================================================*\
Function: _compiled_template_exists Function: _compiled_template_exists
Purpose: Purpose:
@@ -749,7 +685,7 @@ function _generate_debug_output() {
function _write_compiled_template($compile_path, $template_compiled) function _write_compiled_template($compile_path, $template_compiled)
{ {
// we save everything into $compile_dir // we save everything into $compile_dir
$this->_write_file($compile_path, $template_compiled); $this->_write_file($compile_path, $template_compiled, true);
return true; return true;
} }
@@ -872,8 +808,7 @@ function _generate_debug_output() {
array_unshift($this->_config, $this->_config[0]); array_unshift($this->_config, $this->_config[0]);
if($this->_process_template($_smarty_include_tpl_file, $compile_path)) if ($this->_process_template($_smarty_include_tpl_file, $compile_path, $compile_id)) {
{
if ($this->show_info_include) { if ($this->show_info_include) {
echo "\n<!-- SMARTY_BEGIN: ".$_smarty_include_tpl_file." -->\n"; echo "\n<!-- SMARTY_BEGIN: ".$_smarty_include_tpl_file." -->\n";
} }
@@ -1039,37 +974,78 @@ function _run_mod_handler()
} }
/*======================================================================*\ /*======================================================================*\
Function: _clear_tpl_cache_dir Function: _get_auto_base
Purpose: Clear the specified template cache Purpose: Get a base name for automatic files creation
\*======================================================================*/ \*======================================================================*/
function _clear_tpl_cache_dir($cache_tpl_md5) function _get_auto_base($auto_base, $auto_source)
{ {
$cache_dir = $this->cache_dir.'/'.$cache_tpl_md5; $source_md5 = md5($auto_source);
if (!is_dir($cache_dir)) $res = $auto_base . '/' . substr($source_md5, 0, 2) . '/' . $source_md5;
return $res;
}
/*======================================================================*\
Function: _get_auto_filename
Purpose: get a concrete filename for automagically created content
\*======================================================================*/
function _get_auto_filename($auto_base, $auto_source, $auto_id = null)
{
$res = $this->_get_auto_base($auto_base, $auto_source) .
'/' . md5($auto_id) . '.php';
return $res;
}
/*======================================================================*\
Function: _rm_auto
Purpose: delete an automagically created file by name and id
\*======================================================================*/
function _rm_auto($auto_base, $auto_source = null, $auto_id = null)
{
if (!is_dir($auto_base))
return false; return false;
$dir_handle = opendir($cache_dir); if (!isset($auto_source)) {
while ($curr_dir = readdir($dir_handle)) { $res = $this->_rmdir($auto_base, 0);
$cache_path_dir = $cache_dir.'/'.$curr_dir; } else {
if ($curr_dir == '.' || $curr_dir == '..' || if (isset($auto_id)) {
!is_dir($cache_path_dir)) $tname = $this->_get_auto_filename($auto_base, $auto_source, $auto_id);
continue; $res = is_file($tname) && unlink( $tname);
} else {
$dir_handle2 = opendir($cache_path_dir); $tname = $this->_get_auto_base($auto_base, $auto_source);
while ($curr_file = readdir($dir_handle2)) { $res = $this->_rmdir($tname);
if ($curr_file == '.' || $curr_file == '..')
continue;
$cache_file = $cache_path_dir.'/'.$curr_file;
if (is_file($cache_file))
unlink($cache_file);
} }
closedir($dir_handle2);
@rmdir($cache_path_dir);
} }
closedir($dir_handle);
@rmdir($cache_dir); return $res;
}
/*======================================================================*\
Function: _rmdir
Purpose: delete a dir recursively (level=0 -> keep root)
WARNING: no security whatsoever!!
\*======================================================================*/
function _rmdir($dirname, $level = 1)
{
$handle = opendir($dirname);
while ($entry = readdir($handle)) {
if ($entry != '.' && $entry != '..') {
if (is_dir($dirname . '/' . $entry)) {
$this->_rmdir($dirname . '/' . $entry, $level + 1);
}
else {
unlink($dirname . '/' . $entry);
}
}
}
closedir($handle);
if ($level)
rmdir($dirname);
return true; return true;
} }