Кэшируются чанки внутри сниппета
        Друзья, спасайте. Весь мозг сломал, не понимаю причины, по которой внутри сниппета кэшируются 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);            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.