joomla 插件在没有缓存的情况下可以正常工作,并且不适用于缓存

joomla plugin works correctly without caching and does not work with caching

如果关闭缓存,则一切正常。如果启用缓存,开始时插件可以正常工作,但 5 分钟后它会停止处理该行。正常或渐进式缓存——这无关紧要。当您删除缓存时 — 处理将再次打开,并在 5 分钟后再次消失。 这是完整的插件代码。可能是什么原因? 插入 material 的代码,例如 {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);
        }
    }
}

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

您可以通过将插件移到缓存之后(或最后)来解决此问题

如果插件属于不同类型,即 Content,则无法实现。

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

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

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