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);
}
}
}
插件事件按照它们在插件管理中的顺序调用。
Cache 是 System plugins 的一部分,因此当它们的缓存有效时,将从 Cache 中检索响应,并且不会执行它之前的插件.
您可以通过将插件移到缓存之后(或最后)来解决此问题
如果插件属于不同类型,即 Content,则无法实现。
您可以将其更改为系统插件(来自任何插件类别的所有事件也可在系统插件中使用)。
另一个选择,你可以把你的代码放在一个模块中,防止在模块中缓存;但这不适用于页面缓存。
最后,我不知道为什么我不先写它,对您不会缓存的页面进行 Ajax 调用(通过在 page cache
插件中排除它配置:这样页面将被缓存,每次它都会检索当前数据。
如果关闭缓存,则一切正常。如果启用缓存,开始时插件可以正常工作,但 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);
}
}
}
插件事件按照它们在插件管理中的顺序调用。 Cache 是 System plugins 的一部分,因此当它们的缓存有效时,将从 Cache 中检索响应,并且不会执行它之前的插件.
您可以通过将插件移到缓存之后(或最后)来解决此问题
如果插件属于不同类型,即 Content,则无法实现。
您可以将其更改为系统插件(来自任何插件类别的所有事件也可在系统插件中使用)。
另一个选择,你可以把你的代码放在一个模块中,防止在模块中缓存;但这不适用于页面缓存。
最后,我不知道为什么我不先写它,对您不会缓存的页面进行 Ajax 调用(通过在 page cache
插件中排除它配置:这样页面将被缓存,每次它都会检索当前数据。