Кэшируются чанки внутри сниппета

Друзья, спасайте. Весь мозг сломал, не понимаю причины, по которой внутри сниппета кэшируются getChunk() и process().

Есть чанк 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 — та же самая петрушка. :(
Константин
15 января 2015, 19:36
modx.pro
1
2 075
0

Комментарии: 14

Василий Наумкин
16 января 2015, 07:06
0
Попробуй добавить еще
$adv->_content = '';

В pdoTools так и работает.
    Константин
    16 января 2015, 15:29
    0
    Не помогло. :(

    Видимо нужно искать этот объект в исходниках и смотреть, что же там такого кривого делается… :(
      Константин
      16 января 2015, 15:38
      0
      Также менял нижнюю строку
      $html .= $modx->getChunk($tpl, $props);
      на

      getParser(), _content = '' и process() - без толку.
        Сергей Шлоков
        16 января 2015, 15:57
        0
        Попробуй заменить
        $props['Advertisment'] = $n;
          Константин
          16 января 2015, 16:56
          0
          С $n все ок, выводится 2, в следующем месте 12, потом 22. Так и должно быть.
          Сергей Шлоков
          16 января 2015, 15:58
          0
          Я уже вставил в сниппет uniqid() вместо рекламы — во всех рекламных местах появляется один и тот же идентификатор, значит вывод чанка кэшируется.
          Не совсем понятно, что ты имел ввиду. Вставляешь в сниппет, а кешируется чанк? Это как?
            Константин
            16 января 2015, 17:04
            0
            Я написал выше структуру:

            Сниппет GetStudios выводит ресурсы из базы, при этом в определенные места 2, 12, 22 и т.д. он добавляет рекламу путем вставки чанка Adv. Чанк нужен для внешнего оформления рекламы (отсупы, бордеры, и т.д.). Внутри этого чанка идет вызов еще одного сниппета (GetRandomAdv), он выдает случайную картинку с рекламой. Получается схема:

            [[GetStudios]]  -> (если строка 2) -> [[$Adv]] -> [[!GetRandomAdv]]
            			-> (если строка 12) -> [[$Adv]] -> [[!GetRandomAdv]]
            Adv — чанк, который является оберткой для второго снипета. Если бы он не кэшировался — я бы получил в 3 местах разную рекламу, но она ВСЕГДА динаковая.
              Константин
              16 января 2015, 17:09
              0
              Если все преобразовать к виду:

              [[GetStudios]]  -> (если строка 2) -> [[!GetRandomAdv? &tpl=`Adv`]]
              ...
              Все работает идеально, в 3 местах разная реклама, но:
              1. Я не понимаю, как все-таки избавиться от такого навязчивого кэширования чанков.
              2. Я не смогу использовать нормальный, в принципе, чанк Adv в других местах своего проекта, поскольку его придется менять на:

              <div>[[+output]]</div>
                Сергей Шлоков
                16 января 2015, 17:28
                0
                чанк в этой конструкции абсолютно лишний. В других местах тоже используй сниппет с шаблоном.
                  Константин
                  16 января 2015, 18:45
                  0
                  Как бы да… Я уже написал выше, что у меня есть рабочее решение, которое технически работает корректно и я могу его использовать, но:
                  1. Оно не отвечает на вопрос «Откуда здесь берется кэширование?» Это мне важно для понимания принципов ModX, а фраза «чанк в этой конструкции абсолютно лишний» не дает разъяснений. Можете пояснить, что я сделал неправильно в предыдущем решении?
                  2. Решение, которое вы рекомендуете подразумевает вызовы:

                  [[!GetRandomAdv? &tpl=`Adv`]] - в обычных местах проекта
                  [[GetStudios? &advTpl=`Adv` &advSnippet='GetRandomAdv']] - в выводе ресурсов с которым я работаю
                  вместо

                  [[$Adv]]- в обычных местах проекта
                  [[GetStudios? &advTpl=`Adv`]] - в выводе ресурсов
                  Второй вариант проще и нагляднее для стороннего человека. За это и сражаюсь.
                    Сергей Шлоков
                    16 января 2015, 19:28
                    0
                    Оно не отвечает на вопрос «Откуда здесь берется кэширование?» Это мне важно для понимания принципов ModX, а фраза «чанк в этой конструкции абсолютно лишний» не дает разъяснений. Можете пояснить, что я сделал неправильно в предыдущем решении?
                    Причины могут быть разные, но это не важно, так как твой код не оптимален. Ты идешь сложным путем. Я тебе предложил упростить конструкцию и не париться. Хочешь разобраться почему твоя конструкция не работает, разбирайся. Кроме тебя это никому не интересно. Честно.
                    Решение, которое я рекомендую
                    // $tpl=`Adv` можно указать или в самом сниппете или в параметрах по умолчанию сниппета (или просто вызвать $modx->getChunk('Adv', $props);) 
                    [[!GetRandomAdv?]] - в обычных местах проекта
                    // Сниппет GetRandomAdv вызывается внутри сниппета GetStudios
                    [[!GetStudios?]] - в выводе ресурсов с которым я работаю
              Илья Уткин
              16 января 2015, 17:58
              0
              [[!$Adv]] не пробовал?
                Константин
                16 января 2015, 18:47
                0
                Нету вызова чанка через [[$Adv]], я написал это в схеме для наглядности. В сниппете используется getElement('modChunk') и $adv->setCacheable(false);
                Илья Уткин
                16 января 2015, 18:56
                0
                А так не работает?

                $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);
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  14