【问题标题】:joomla plugin works correctly without caching and does not work with cachingjoomla 插件在没有缓存的情况下可以正常工作,并且不能与缓存一起使用
【发布时间】:2020-05-13 00:19:05
【问题描述】:

如果缓存被关闭,那么一切正常。如果启用缓存,插件在开始时可以正常工作,但 5 分钟后它会停止处理该行。普通或渐进式缓存——没关系。当您删除缓存时-处理再次打开,5分钟后再次消失。 这是完整的插件代码。可能是什么原因? 插入到材料中的代码,例如 {robokassa 5}


 class plgContentRobokassa extends JPlugin
{
    public $cont='';
    public function onContentPrepare($context, &$row, &$params, $page = 0)
    {
     $doc  = JFactory::getDocument();
     $doc->addStyleSheet(JURI::root(true).'/plugins/content/robokassa/css/robokassa.css');
     $this->cont=$context;
    }


    public function onAfterRender()
    {
 $is_test='0';
 $mrh_pass1='*****';
 $mrh_login='******';
        $app = JFactory::getApplication();
        if ($app->getName() != 'site') {
            return true;
        }

        // Получаем кодовое слово из параметров
        $varname = 'robokassa';

        //Получаем тело сайта
        $html = $app->getBody();

        // Если тегов нет
        if (strpos($html, $varname) === false)
        {
            return true;
        }
        $bodyPos = stripos($html, '<body');
        $preContent = '';
        if ($bodyPos > -1)
        {
            $preContent = substr($html, 0, $bodyPos);
            $html = substr($html, $bodyPos);
        }

        //Задаем шаблон поиска
        $pattern = '#\{' . $varname . ' ([0-9]+)\}#i';

        //Закидываем все найденные шаблоны в массив
        if (preg_match_all($pattern, $html, $matches))
        {
         $db = JFactory::getDbo();
         $query = $db->getQuery(true);
            foreach ($matches[0] as $i => $match)
            {
                *replace code here*
            }
             $html=$preContent.$html.$script_alert;
            //Запихиваем всё обратно в тело
            $app->setBody($html);
        }
    }
}

【问题讨论】:

    标签: caching plugins joomla


    【解决方案1】:

    插件事件按照它们在插件管理中的顺序被调用。 缓存系统插件 的一部分,因此当它们的缓存有效时,将从缓存中检索响应,并且不会执行之前的插件。

    你可以通过在缓存之后(或最后一个)移动你的插件来解决这个问题

    如果插件是不同类型的,即内容,则无法实现这一点。

    您可以将其更改为系统插件(来自任何插件类别的所有事件也可以在系统插件中使用)。

    另一种选择,您可以将代码放在模块中,防止在模块中缓存;但这不适用于页面缓存。

    最后,我不知道为什么我不先写它,对您不会缓存的页面进行 Ajax 调用(通过在 page cache 插件配置中排除它:这样页面将是缓存,每次都会检索当前数据。

    【讨论】:

    • 不走运。如果它停留在“内容”组,并且我将它放在最后一个插件列表中,它仍然会在 5 分钟以上消失。如果我将它更改为“系统”组并放置最后一个- 它根本不起作用,即使没有缓存。
    • 你检查过我更新的答案了吗?请让我知道它是否有效
    • 我将插件重新构建为系统插件,目前可以使用。谢谢。
    猜你喜欢
    • 2013-01-04
    • 2020-08-18
    • 2012-08-04
    • 1970-01-01
    • 2020-06-27
    • 2013-07-28
    • 2011-11-14
    • 2012-08-17
    • 2015-10-15
    相关资源
    最近更新 更多