Ошибка setPlaceholder
В MODX 2.5.0 всплыла неприятная ошибка. Если, какую-нибудь, переменную в сниппете послать в плейсходер, например
Так же, если если этот плейсходер отправить в сниппет, то if тоже не работает как надо.
Сталкивался раньше, что модификаторы таинственным образом перестают работать. А сегодня обнаружилось, что не работают именно из-за setPlaceholder.
$modx->setPlaceholder('topic_bar_cat',1);
, то с этим плейсхолдером не работают модификаторы. [[+topic_bar_cat:is=`1`:then=`true`:else=`false`]]
всегда выдает false. Хотя [[+topic_bar_cat]]
выдает 1.Так же, если если этот плейсходер отправить в сниппет, то if тоже не работает как надо.
Сталкивался раньше, что модификаторы таинственным образом перестают работать. А сегодня обнаружилось, что не работают именно из-за setPlaceholder.
Поблагодарить автора
Отправить деньги
Комментарии: 19
Только что работал с плейсхолдером из плагина, MODX 2.5.0
В плагине:
Результат: Не равно одному
если ставлю = 1, то выводит Один
В плагине:
$modx->setPlaceholders(array('testPlaceholder' => 3),'ge.');
На странице[[+ge.testPlaceholder:is=`1`:then=`Один`:else=`Не равно одному`]]
Результат: Не равно одному
если ставлю = 1, то выводит Один
Проверь пожалуйста еще функцию
$modx->setPlaceholder
как у ТС.
Мое упущение. Проверил не работает, автор не врет))
Дорогие друзья! Напоминаю, что при использование кэшированного плейсхолдера фильтр отработает только один раз. В следующий раз на странице будет выводится уже закэшированное значение. Для плейсхолдеров с фильтрами используйте "!".
[[!+topic_bar_cat:is=`1`:then=`true`:else=`false`]]
Это наверно нужно, но в данном случае вызов не кешированным не помогает. Какая-то ошибка с приведением типов переменной. Если отправить этот плейсхолдер в сниппет, то
echo intval($topic_bar_cat);
//выдает 0
echo $topic_bar_cat;
//выдает 1
Написал специально тестовый сниппет и все заработало. Разобрался в чем косяк :). Я в форме вызывал плейсхолдер с модификатором раньше, чем сниппет который выставляет плейсхолдер.
Наверно парсер MODX обрабатывает плейсхолдер с модификатором раньше, чем выставляется сам плейсхолдер.
[[$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 обрабатывает плейсхолдер с модификатором раньше, чем выставляется сам плейсхолдер.
Логично, что он обрабатывается в момент, когда встречен, а не откладывается в сторону с мыслями «Вдруг когда-нибудь его выставят».
а не откладывается в сторону с мыслями «Вдруг когда-нибудь его выставят».На самом деле откладывается :)
Бегло глянул исходники — не увидел, где бы такое найти. Просвети? :)
Попробуй вызвать на странице сначала плейсхолдер, а потом сниппет его выставляющий:
[[!+test]]
[[!setPlsTest]]
А в сниппете просто выставить плейсхолдер test$modx->setPlaceholder(test','Тестовое значение');
Удивился?
Мой коммент выше :)
А вопрос был о кэшированных плейсхолдерах, по поводу которых я написал ответ автору.
А вопрос был о кэшированных плейсхолдерах, по поводу которых я написал ответ автору.
Кстати, точно помню такое поведение: кэшируемые плейсхолдеры обрабатываются только после выставляющих их сниппетов. И только некэшируемые откладываются в сторону на «по-позже».
Не так. Любые плейсхолдеры откладываются. По-умолчанию парсер делает 10 циклов. На первом цикле не нашел, отложил на второй цикл и т.д. А вот с фильтрами ситуация другая. Парсер на первом же цикле проверит его и вернет соответствующее значение из then или else. Вот почему в данном топике не работало. Так как на втором цикле этого плейсхолдера уже нет, вместо него значение «false».
П.С. А кэшированные плейсхолдеры сработают только первый раз.
П.С. А кэшированные плейсхолдеры сработают только первый раз.
В приведенном тобой примере
[[!+test]]
[[!setPlsTest]]
Плейсхолдер разве выставится, если сделать его некэшируемым? Сейчас сам проверить не могу.
Конечно, но только первый раз. Потом значение закэшируется.
Имел ввиду кэшируемый плейсхолдер. Думаю, ты понял :)
Понял, ибо именно это и имел ввиду я ))
.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.