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