Ошибка setPlaceholder

В MODX 2.5.0 всплыла неприятная ошибка. Если, какую-нибудь, переменную в сниппете послать в плейсходер, например
$modx->setPlaceholder('topic_bar_cat',1);
, то с этим плейсхолдером не работают модификаторы.
[[+topic_bar_cat:is=`1`:then=`true`:else=`false`]]
всегда выдает false. Хотя
[[+topic_bar_cat]]
выдает 1.
Так же, если если этот плейсходер отправить в сниппет, то if тоже не работает как надо.
Сталкивался раньше, что модификаторы таинственным образом перестают работать. А сегодня обнаружилось, что не работают именно из-за setPlaceholder.
Александр Туниеков
22 сентября 2016, 06:31
modx.pro
2 542
0
Поблагодарить автора Отправить деньги

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

Константин Ильин
22 сентября 2016, 16:13
0
Только что работал с плейсхолдером из плагина, MODX 2.5.0
В плагине:
$modx->setPlaceholders(array('testPlaceholder' => 3),'ge.');
На странице
[[+ge.testPlaceholder:is=`1`:then=`Один`:else=`Не равно одному`]]

Результат: Не равно одному
если ставлю = 1, то выводит Один
    Роман Садоян
    22 сентября 2016, 16:32
    +1
    Проверь пожалуйста еще функцию
    $modx->setPlaceholder
    как у ТС.
      Константин Ильин
      22 сентября 2016, 16:43
      +1
      Мое упущение. Проверил не работает, автор не врет))
        Сергей Шлоков
        22 сентября 2016, 18:33
        +1
        Дорогие друзья! Напоминаю, что при использование кэшированного плейсхолдера фильтр отработает только один раз. В следующий раз на странице будет выводится уже закэшированное значение. Для плейсхолдеров с фильтрами используйте "!".
        [[!+topic_bar_cat:is=`1`:then=`true`:else=`false`]]
          Александр Туниеков
          22 сентября 2016, 20:33
          0
          Это наверно нужно, но в данном случае вызов не кешированным не помогает. Какая-то ошибка с приведением типов переменной. Если отправить этот плейсхолдер в сниппет, то
          echo intval($topic_bar_cat);
          //выдает 0
          echo $topic_bar_cat;
          //выдает 1
            Сергей Шлоков
            22 сентября 2016, 22:34
            0
            Если отправить этот плейсхолдер в сниппет
            Это как?
            Специально ваш попробовал код из топика. Всё работает.


              Александр Туниеков
              23 сентября 2016, 00:31
              0
              Написал специально тестовый сниппет и все заработало. Разобрался в чем косяк :). Я в форме вызывал плейсхолдер с модификатором раньше, чем сниппет который выставляет плейсхолдер.
              [[$search_form]]
              [[!+topic_bar_cat]]
              [[!+topic_bar_cat:is=`1`:then=`true`:else=`false`]]
              [[!pdoPage?
              	&element=`mSearch2`
              	&limit=`10`
              	&where=`[[!get_search_where?]]`
              	&includeTVs=`topic_bar_cat,topic_price,topic_torg,topic_sity`
              	&tpl=`My.tpl.mSearch2.row`
              ]]
              
              <div class="pagination">
              	[[!+page.nav]]
              </div>
              Плейсхолдер выставляет
              [[!get_search_where?]]
              .

              Наверно парсер MODX обрабатывает плейсхолдер с модификатором раньше, чем выставляется сам плейсхолдер.
                Воеводский Михаил
                23 сентября 2016, 11:24
                +1
                Логично, что он обрабатывается в момент, когда встречен, а не откладывается в сторону с мыслями «Вдруг когда-нибудь его выставят».
                  Сергей Шлоков
                  23 сентября 2016, 12:50
                  0
                  а не откладывается в сторону с мыслями «Вдруг когда-нибудь его выставят».
                  На самом деле откладывается :)
                    Воеводский Михаил
                    23 сентября 2016, 12:58
                    0
                    Бегло глянул исходники — не увидел, где бы такое найти. Просвети? :)
                      Сергей Шлоков
                      23 сентября 2016, 13:20
                      0
                      Попробуй вызвать на странице сначала плейсхолдер, а потом сниппет его выставляющий:
                      [[!+test]]
                      [[!setPlsTest]]
                      А в сниппете просто выставить плейсхолдер test
                      $modx->setPlaceholder(test','Тестовое значение');
                      Удивился?
                      Воеводский Михаил
                      23 сентября 2016, 13:24
                      0
                      Мой коммент выше :)
                      А вопрос был о кэшированных плейсхолдерах, по поводу которых я написал ответ автору.
                    Воеводский Михаил
                    23 сентября 2016, 13:13
                    0
                    Кстати, точно помню такое поведение: кэшируемые плейсхолдеры обрабатываются только после выставляющих их сниппетов. И только некэшируемые откладываются в сторону на «по-позже».
                      Сергей Шлоков
                      23 сентября 2016, 13:25
                      1
                      +1
                      Не так. Любые плейсхолдеры откладываются. По-умолчанию парсер делает 10 циклов. На первом цикле не нашел, отложил на второй цикл и т.д. А вот с фильтрами ситуация другая. Парсер на первом же цикле проверит его и вернет соответствующее значение из then или else. Вот почему в данном топике не работало. Так как на втором цикле этого плейсхолдера уже нет, вместо него значение «false».
                      П.С. А кэшированные плейсхолдеры сработают только первый раз.
                      Воеводский Михаил
                      23 сентября 2016, 13:33
                      0
                      В приведенном тобой примере
                      [[!+test]]
                      [[!setPlsTest]]
                      Плейсхолдер разве выставится, если сделать его некэшируемым? Сейчас сам проверить не могу.
                      Сергей Шлоков
                      23 сентября 2016, 13:37
                      0
                      Конечно, но только первый раз. Потом значение закэшируется.
                      Сергей Шлоков
                      23 сентября 2016, 13:54
                      0
                      Имел ввиду кэшируемый плейсхолдер. Думаю, ты понял :)
                      Воеводский Михаил
                      23 сентября 2016, 13:58
                      0
                      Понял, ибо именно это и имел ввиду я ))
                    Воеводский Михаил
                    23 сентября 2016, 13:14
                    0
                    .
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    19