Ошибка 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, 09:31    Александр   
0    561 0

Комментарии (19)

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

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


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