我们可以在Prestashop模块的钩子里面设置一个代码块的缓存,但是我们不能为这个缓存设置一个生命周期。
这是一个使用缓存功能的钩子:
protected function _prepareHook()
{
if (!$this->isCached('homeslider.tpl', $this->getCacheId()))
{
$slides = $this->getSlides(true);
if (is_array($slides))
foreach ($slides as &$slide)
{
$slide['sizes'] = @getimagesize((dirname(__FILE__).DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.$slide['image']));
if (isset($slide['sizes'][3]) && $slide['sizes'][3])
$slide['size'] = $slide['sizes'][3];
}
if (!$slides)
return false;
$this->smarty->assign(array('homeslider_slides' => $slides));
}
return true;
}
有没有办法强制此缓存每小时过期?
答案 0 :(得分:1)
Smarty可以处理缓存的生命周期,但Prestashop并没有提出使用缓存的方法。
我们必须覆盖Module.php
和Tools.php
类才能添加此功能:
Tools.php
:
<?php
class Tools extends ToolsCore
{
public static function enableCache($level = 1, Context $context = null, $lifetime = null)
{
if (!$context) {
$context = Context::getContext();
}
$smarty = $context->smarty;
if (!Configuration::get('PS_SMARTY_CACHE')) {
return;
}
if ($smarty->force_compile == 0 && $smarty->caching == $level) {
return;
}
self::$_forceCompile = (int)$smarty->force_compile;
self::$_caching = (int)$smarty->caching;
$smarty->force_compile = 0;
$smarty->caching = (int)$level;
// If there is a lifetime provided then set the cache_lifetime to this value
$smarty->cache_lifetime = is_null($lifetime) ? 31536000 : (int) $lifetime; // 1 Year
}
}
默认情况下,Prestashop将缓存生命周期设置为1年。在这里,我们添加了第三个参数,允许我们定义自己的生命时间。
Module.php
:
<?php
class Module extends ModuleCore {
/**
* @param string $template
* @param null|string $cache_id
* @param null|string $compile_id
* @param int|null $lifetime cache life time
* @return bool
*/
public function isCached($template, $cache_id = null, $compile_id = null, $lifetime = null)
{
if (Tools::getIsset('live_edit') || Tools::getIsset('live_configurator_token')) {
return false;
}
Tools::enableCache(1, null, $lifetime);
$new_tpl = $this->getTemplatePath($template);
$is_cached = $this->getCurrentSubTemplate($template, $cache_id, $compile_id)->isCached($new_tpl, $cache_id, $compile_id);
Tools::restoreCacheSettings();
return $is_cached;
}
}
我们在此处向isCached()
方法添加了一个新参数,该参数将在上面enableCache
类中更改的Tools.php
方法中使用。
我们需要删除文件cache/class_index.php
,以便Prestashop加载我们新创建的覆盖。
我们现在可以在钩子中使用这个新参数:
protected function _prepareHook()
{
if (!$this->isCached('homeslider.tpl', $this->getCacheId(), null, 3600))
{
$slides = $this->getSlides(true);
if (is_array($slides))
foreach ($slides as &$slide)
{
$slide['sizes'] = @getimagesize((dirname(__FILE__).DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.$slide['image']));
if (isset($slide['sizes'][3]) && $slide['sizes'][3])
$slide['size'] = $slide['sizes'][3];
}
if (!$slides)
return false;
$this->smarty->assign(array('homeslider_slides' => $slides));
}
return true;
}