Кэшируются чанки внутри сниппета
Друзья, спасайте. Весь мозг сломал, не понимаю причины, по которой внутри сниппета кэшируются getChunk() и process().
Есть чанк Adv (это упрощенная версия, смысл в том, что в определенный шаблон вставляется случайная реклама):
Пробовал getChunk — та же самая петрушка. :(
Есть чанк Adv (это упрощенная версия, смысл в том, что в определенный шаблон вставляется случайная реклама):
<div>[[!GetRandomAdv]]</div>
Есть сниппет:$studios = $modx->getCollection('modResource', $q);
foreach ($studios as $s)
{
...
// Во вторую и каждую десятую записи подставляем рекламу из чанка Adv
if ($n == 2 || ($n-2)%10 == 0){
$adv = $modx->getParser()->getElement('modChunk', 'Adv');
$adv->setCacheable(false);
$adv->_processed = false;
$props['Advertisment'] = $adv->process();
}
$html .= $modx->getChunk($tpl, $props);
}
return($html);
Почему-то во всех вставках на странице реклама появляется одна и та же. Я уже вставил в сниппет uniqid() вместо рекламы — во всех рекламных местах появляется один и тот же идентификатор, значит вывод чанка кэшируется. С чем это может быть связано?Пробовал getChunk — та же самая петрушка. :(
Комментарии: 14
Не помогло. :(
Видимо нужно искать этот объект в исходниках и смотреть, что же там такого кривого делается… :(
Видимо нужно искать этот объект в исходниках и смотреть, что же там такого кривого делается… :(
Также менял нижнюю строку
$html .= $modx->getChunk($tpl, $props);
на getParser(), _content = '' и process() - без толку.
Попробуй заменить
$props['Advertisment'] = $n;
С $n все ок, выводится 2, в следующем месте 12, потом 22. Так и должно быть.
Я уже вставил в сниппет uniqid() вместо рекламы — во всех рекламных местах появляется один и тот же идентификатор, значит вывод чанка кэшируется.Не совсем понятно, что ты имел ввиду. Вставляешь в сниппет, а кешируется чанк? Это как?
Я написал выше структуру:
Сниппет GetStudios выводит ресурсы из базы, при этом в определенные места 2, 12, 22 и т.д. он добавляет рекламу путем вставки чанка Adv. Чанк нужен для внешнего оформления рекламы (отсупы, бордеры, и т.д.). Внутри этого чанка идет вызов еще одного сниппета (GetRandomAdv), он выдает случайную картинку с рекламой. Получается схема:
Сниппет GetStudios выводит ресурсы из базы, при этом в определенные места 2, 12, 22 и т.д. он добавляет рекламу путем вставки чанка Adv. Чанк нужен для внешнего оформления рекламы (отсупы, бордеры, и т.д.). Внутри этого чанка идет вызов еще одного сниппета (GetRandomAdv), он выдает случайную картинку с рекламой. Получается схема:
[[GetStudios]] -> (если строка 2) -> [[$Adv]] -> [[!GetRandomAdv]]
-> (если строка 12) -> [[$Adv]] -> [[!GetRandomAdv]]
Adv — чанк, который является оберткой для второго снипета. Если бы он не кэшировался — я бы получил в 3 местах разную рекламу, но она ВСЕГДА динаковая.
Если все преобразовать к виду:
1. Я не понимаю, как все-таки избавиться от такого навязчивого кэширования чанков.
2. Я не смогу использовать нормальный, в принципе, чанк Adv в других местах своего проекта, поскольку его придется менять на:
[[GetStudios]] -> (если строка 2) -> [[!GetRandomAdv? &tpl=`Adv`]]
...
Все работает идеально, в 3 местах разная реклама, но:1. Я не понимаю, как все-таки избавиться от такого навязчивого кэширования чанков.
2. Я не смогу использовать нормальный, в принципе, чанк Adv в других местах своего проекта, поскольку его придется менять на:
<div>[[+output]]</div>
чанк в этой конструкции абсолютно лишний. В других местах тоже используй сниппет с шаблоном.
Как бы да… Я уже написал выше, что у меня есть рабочее решение, которое технически работает корректно и я могу его использовать, но:
1. Оно не отвечает на вопрос «Откуда здесь берется кэширование?» Это мне важно для понимания принципов ModX, а фраза «чанк в этой конструкции абсолютно лишний» не дает разъяснений. Можете пояснить, что я сделал неправильно в предыдущем решении?
2. Решение, которое вы рекомендуете подразумевает вызовы:
1. Оно не отвечает на вопрос «Откуда здесь берется кэширование?» Это мне важно для понимания принципов ModX, а фраза «чанк в этой конструкции абсолютно лишний» не дает разъяснений. Можете пояснить, что я сделал неправильно в предыдущем решении?
2. Решение, которое вы рекомендуете подразумевает вызовы:
[[!GetRandomAdv? &tpl=`Adv`]] - в обычных местах проекта
[[GetStudios? &advTpl=`Adv` &advSnippet='GetRandomAdv']] - в выводе ресурсов с которым я работаю
вместо[[$Adv]]- в обычных местах проекта
[[GetStudios? &advTpl=`Adv`]] - в выводе ресурсов
Второй вариант проще и нагляднее для стороннего человека. За это и сражаюсь. Оно не отвечает на вопрос «Откуда здесь берется кэширование?» Это мне важно для понимания принципов ModX, а фраза «чанк в этой конструкции абсолютно лишний» не дает разъяснений. Можете пояснить, что я сделал неправильно в предыдущем решении?Причины могут быть разные, но это не важно, так как твой код не оптимален. Ты идешь сложным путем. Я тебе предложил упростить конструкцию и не париться. Хочешь разобраться почему твоя конструкция не работает, разбирайся. Кроме тебя это никому не интересно. Честно.
Решение, которое я рекомендую
// $tpl=`Adv` можно указать или в самом сниппете или в параметрах по умолчанию сниппета (или просто вызвать $modx->getChunk('Adv', $props);)
[[!GetRandomAdv?]] - в обычных местах проекта
// Сниппет GetRandomAdv вызывается внутри сниппета GetStudios
[[!GetStudios?]] - в выводе ресурсов с которым я работаю
[[!$Adv]] не пробовал?
Нету вызова чанка через [[$Adv]], я написал это в схеме для наглядности. В сниппете используется getElement('modChunk') и $adv->setCacheable(false);
А так не работает?
$studios = $modx->getCollection('modResource', $q);
foreach ($studios as $s)
{
...
// Во вторую и каждую десятую записи подставляем рекламу из чанка Adv
if ($n == 2 || ($n-2)%10 == 0){
$props['Advertisment'] = $modx->getChunk('Adv', $props);
}
$html .= $modx->getChunk($tpl, $props);
}
return($html);
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.