如何在Prestashop中处理缓存过期

时间:2017-09-11 12:47:20

标签: caching prestashop prestashop-1.6

我们可以在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;
}

有没有办法强制此缓存每小时过期?

1 个答案:

答案 0 :(得分:1)

Smarty可以处理缓存的生命周期,但Prestashop并没有提出使用缓存的方法。

我们必须覆盖Module.phpTools.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;
}