© Сделано на LiveStreet
Дизайн - ©2009 MODx RED Group
preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
if ($matches[0]) {
$template = str_replace($matches[0], '', $template);
$this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
}
var $placeholders = array();
var $snippetsQuantity=0;
var $snippetsParsed=0;
$template = $modx->documentOutput;
preg_match_all('~\[(\[|\!)(.*?)(\]|\!)\]~s', $template, $matches);
$this->snippetsQuantity=count($matches[0]);
preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
if ($matches[0]) {
$template = str_replace($matches[0], '', $template);
$this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
}
if ($this->snippetsParsed > $this->snippetsQuantity || ($this->snippetsQuantity==0) )
{
preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?|)(\1|\))\]~s', $template, $matches);
if ($matches[0]) {
$template = str_replace($matches[0], '', $template);
$this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
}
}
$replace = $modx->evalSnippets("[[".$snippet."]]");
$this->LogSnippet($replace);
// Replace values
$var_search[] = $matches[0][$i];
$var_replace[] = $replace;
$this->snippetsParsed++;
Комментарии (21)
RSS свернуть / развернутьНасколько надежен способ подсчета количества сниппетов на странице через регулярное выражение?
Скажем, это не нарушит логику, если внутри шаблонов того же Дитто будут стоять вызовы сниппетов?
И еще, я выкладывал сюда решение по доработке кеширования PHx (которое тоже оказалось бажным), может слить эти два патча в один?
antonkuzmin
У меня получалось всегда, что именно плагин запускал класс последним. Но это не догма. Конечно, это дело тестирования.
Кстати про ваше решение: я его туда вроде инсталлировал :) И оно есть в прикрепленном файле.
А на форум разработчикам pHx по-моему бесполезно писать. Может, конечно, я не туда пишу http://modxcms.com/forums/index.php/topic,50281.msg301735.html#msg301735?
kpoxas
моя же реализация не просто чинит собственный кеш phx, но заставляет его использовать «общий» кеш сниппетов modx, что, имхо, правильнее.
antonkuzmin
kpoxas
если я вызываю такую конструкцию:
Выполняется 17 запросов к БД не на странице 81!
А при такой:
всего 4!!!
Есть мнения, как это исправить?
kpoxas
вообще 4 запроса на ресурс — подозрительно мало для дитто.
antonkuzmin
Дело в том что PhX выполняет сниппет в независимости от того, должен он выводиться или нет
kpoxas
насколько я понимаю устройство modx, кешируемый вызов сниппета отличается от некешируемого только в том случае, когда страница берется из кеша: или результат выполнения сниппета целиком записывается в файл кеша страницы, или там остается только его вызов.
возможно, происходит какой-то конфликт при сочетании некешируемой страницы, кешируемого вызова сниппета и phx.
хотя если не вдаваться в детали, это определенно баг.
antonkuzmin
kpoxas
kpoxas
на
Вроде работает
kpoxas
не имея времени разбираться с принципом работы phx предложил бы такой способ: вбить все известные плейсхолдеры в «исключения»
вот тот самый злополучный кусок кода, который пропускает обработку Jot и Ditto
глупо, но действенно)
simple_dream
А так делали?
kpoxas
phx парсил страницу несколько раз, и на последнем разе snippetsQuantity неизменно превращалось в ноль — соответственно условие срабатывало :)
simple_dream
kpoxas
simple_dream
Dronowar
kpoxas
simple_dream
Dmi3y
kpoxas
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.