
Comparing changes: https://github.com/smarty-php/smarty/compare/v4.3.1...v4.4.1 It is noticeable that Smarty 4.3.1 does not officially support PHP 8.3. Is only supported with 4.4.0. Remark: During tests with Smarty 4.5.1, it was noticed that the following warning occurs: Deprecated: Using the unregistered function "function_exists" in a template is deprecated and will be removed in a future version. Use Smarty::registerPlugin to explicitly register a custom modifier. As of Smarty 5.X.X, templates must be revised again. The Smarty release 5.0.2 is already officially available. However, integration into FlatPress is not entirely trivial.
184 lines
6.5 KiB
PHP
184 lines
6.5 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Inline Runtime Methods render, setSourceByUid, setupSubTemplate
|
|
*
|
|
* @package Smarty
|
|
* @subpackage PluginsInternal
|
|
* @author Uwe Tews
|
|
**/
|
|
class Smarty_Internal_Runtime_UpdateCache
|
|
{
|
|
/**
|
|
* check client side cache
|
|
*
|
|
* @param \Smarty_Template_Cached $cached
|
|
* @param Smarty_Internal_Template $_template
|
|
* @param string $content
|
|
*/
|
|
public function cacheModifiedCheck(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Cache was invalid , so render from compiled and write to cache
|
|
*
|
|
* @param \Smarty_Template_Cached $cached
|
|
* @param \Smarty_Internal_Template $_template
|
|
* @param $no_output_filter
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
public function updateCache(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $no_output_filter)
|
|
{
|
|
ob_start();
|
|
if (!isset($_template->compiled)) {
|
|
$_template->loadCompiled();
|
|
}
|
|
$_template->compiled->render($_template);
|
|
if ($_template->smarty->debugging) {
|
|
$_template->smarty->_debug->start_cache($_template);
|
|
}
|
|
$this->removeNoCacheHash($cached, $_template, $no_output_filter);
|
|
$compile_check = (int)$_template->compile_check;
|
|
$_template->compile_check = Smarty::COMPILECHECK_OFF;
|
|
if ($_template->_isSubTpl()) {
|
|
$_template->compiled->unifunc = $_template->parent->compiled->unifunc;
|
|
}
|
|
if (!$_template->cached->processed) {
|
|
$_template->cached->process($_template, true);
|
|
}
|
|
$_template->compile_check = $compile_check;
|
|
$cached->getRenderedTemplateCode($_template);
|
|
if ($_template->smarty->debugging) {
|
|
$_template->smarty->_debug->end_cache($_template);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sanitize content and write it to cache resource
|
|
*
|
|
* @param \Smarty_Template_Cached $cached
|
|
* @param Smarty_Internal_Template $_template
|
|
* @param bool $no_output_filter
|
|
*
|
|
* @throws \SmartyException
|
|
*/
|
|
public function removeNoCacheHash(
|
|
Smarty_Template_Cached $cached,
|
|
Smarty_Internal_Template $_template,
|
|
$no_output_filter
|
|
) {
|
|
$php_pattern = '/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/';
|
|
$content = ob_get_clean();
|
|
$hash_array = $cached->hashes;
|
|
$hash_array[ $_template->compiled->nocache_hash ] = true;
|
|
$hash_array = array_keys($hash_array);
|
|
$nocache_hash = '(' . implode('|', $hash_array) . ')';
|
|
$_template->cached->has_nocache_code = false;
|
|
// get text between non-cached items
|
|
$cache_split =
|
|
preg_split(
|
|
"!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s",
|
|
$content
|
|
);
|
|
// get non-cached items
|
|
preg_match_all(
|
|
"!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s",
|
|
$content,
|
|
$cache_parts
|
|
);
|
|
$content = '';
|
|
// loop over items, stitch back together
|
|
foreach ($cache_split as $curr_idx => $curr_split) {
|
|
if (preg_match($php_pattern, $curr_split)) {
|
|
// escape PHP tags in template content
|
|
$php_split = preg_split(
|
|
$php_pattern,
|
|
$curr_split
|
|
);
|
|
preg_match_all(
|
|
$php_pattern,
|
|
$curr_split,
|
|
$php_parts
|
|
);
|
|
foreach ($php_split as $idx_php => $curr_php) {
|
|
$content .= $curr_php;
|
|
if (isset($php_parts[ 0 ][ $idx_php ])) {
|
|
$content .= "<?php echo '{$php_parts[ 1 ][ $idx_php ]}'; ?>\n";
|
|
}
|
|
}
|
|
} else {
|
|
$content .= $curr_split;
|
|
}
|
|
if (isset($cache_parts[ 0 ][ $curr_idx ])) {
|
|
$_template->cached->has_nocache_code = true;
|
|
$content .= $cache_parts[ 2 ][ $curr_idx ];
|
|
}
|
|
}
|
|
if (!$no_output_filter && !$_template->cached->has_nocache_code
|
|
&& (isset($_template->smarty->autoload_filters[ 'output' ])
|
|
|| isset($_template->smarty->registered_filters[ 'output' ]))
|
|
) {
|
|
$content = $_template->smarty->ext->_filterHandler->runFilter('output', $content, $_template);
|
|
}
|
|
// write cache file content
|
|
$this->writeCachedContent($_template, $content);
|
|
}
|
|
|
|
/**
|
|
* Writes the content to cache resource
|
|
*
|
|
* @param Smarty_Internal_Template $_template
|
|
* @param string $content
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function writeCachedContent(Smarty_Internal_Template $_template, $content)
|
|
{
|
|
if ($_template->source->handler->recompiled || !$_template->caching
|
|
) {
|
|
// don't write cache file
|
|
return false;
|
|
}
|
|
if (!isset($_template->cached)) {
|
|
$_template->loadCached();
|
|
}
|
|
$content = $_template->smarty->ext->_codeFrame->create($_template, $content, '', true);
|
|
return $this->write($_template, $content);
|
|
}
|
|
|
|
/**
|
|
* Write this cache object to handler
|
|
*
|
|
* @param Smarty_Internal_Template $_template template object
|
|
* @param string $content content to cache
|
|
*
|
|
* @return bool success
|
|
*/
|
|
public function write(Smarty_Internal_Template $_template, $content)
|
|
{
|
|
if (!$_template->source->handler->recompiled) {
|
|
$cached = $_template->cached;
|
|
if ($cached->handler->writeCachedContent($_template, $content)) {
|
|
$cached->content = null;
|
|
$cached->timestamp = time();
|
|
$cached->exists = true;
|
|
$cached->valid = true;
|
|
$cached->cache_lifetime = $_template->cache_lifetime;
|
|
$cached->processed = false;
|
|
if ($_template->smarty->cache_locking) {
|
|
$cached->handler->releaseLock($_template->smarty, $cached);
|
|
}
|
|
return true;
|
|
}
|
|
$cached->content = null;
|
|
$cached->timestamp = false;
|
|
$cached->exists = false;
|
|
$cached->valid = false;
|
|
$cached->processed = false;
|
|
}
|
|
return false;
|
|
}
|
|
}
|