Вызов сниппета внутри фильтра(модификатора)
Доброй ночи.
Подскажите пожалуйста, как вызывать сниппет внутри фильтра(модификатора)?
Есть карточка товара, там я проверяю наличие товара, если товара нет, то надо показывать форму «оповещение о появлении товара».
Что собственно не так делаю?
Подскажите пожалуйста, как вызывать сниппет внутри фильтра(модификатора)?
Есть карточка товара, там я проверяю наличие товара, если товара нет, то надо показывать форму «оповещение о появлении товара».
[[*price:is=`0`:then=`
<p class="product_price"><i>нет в наличии</i></p>
<div class="product-tocart">
<div class="buttons_row">
<a class="button_blue middle_btn modalWindow" href="#recallProductForm">Напомнить о поступлении</a>
[[!AjaxForm?
&snippet=`FormIt`
&form=`recallProductForm_form`
&hooks=`spam,email`
&emailTpl=`recallProductForm_email`
&emailSubject=`Напоминание о товаре`
&emailTo=`[[++from_email]]`
&validate=`name:required,phone:required`
&validationErrorMessage=`В форме содержатся ошибки!`
&successMessage=`Запрос успешно отправлен`
]]
</div>
</div>
`]]
При заходе на страницу блок с фильтром вообще на странице не отображается.Что собственно не так делаю?
Комментарии: 12
Если вы используете minishop2 для формирования карточки товара, то вам необходим плейсхолдер не [[*price]], а [[!+price]]. В остальном все верно.
Единственный минус подобного решения — из-за специфики работы преобразования плейсхолдеров модкса, в вашем примере вначале выполняется содержимое внутри then (в любом случае, вне зависимости от значения price), а уже после — проверка условия. Что негативно сказывается на производительности, в случае, если количество товаров больше 0 и форма не нужна в принципе.
Единственный минус подобного решения — из-за специфики работы преобразования плейсхолдеров модкса, в вашем примере вначале выполняется содержимое внутри then (в любом случае, вне зависимости от значения price), а уже после — проверка условия. Что негативно сказывается на производительности, в случае, если количество товаров больше 0 и форма не нужна в принципе.
В остальном все верно.Т.е. это нормальная работа modx, что если я хочу вызвать сниппет в модификаторе, то у меня на страницу вообще не выводится все содержимое модификатора???
Что вы подразумеваете под содержимым модификатора?
Сейчас у вас выполняется следующая логика:
— обрабатывается содержимое внутри then=``
— проверяется значение [[*price]] (если у вас minishop2, то такое значение в принципе не находит, т.к. там требуется иной плейсхолдер)
— значение [[*price]] не равно 0 (так как его в принципе нет).
— вам ничего не возвращает, так как нет условия :else=``
Вот пример того, когда вам всегда вернется какой-либо результат:
Сейчас у вас выполняется следующая логика:
— обрабатывается содержимое внутри then=``
— проверяется значение [[*price]] (если у вас minishop2, то такое значение в принципе не находит, т.к. там требуется иной плейсхолдер)
— значение [[*price]] не равно 0 (так как его в принципе нет).
— вам ничего не возвращает, так как нет условия :else=``
Вот пример того, когда вам всегда вернется какой-либо результат:
[[!+price:is=`0`:then=`Код формы`:else=`Цена на товар [[!+price]] рублей`]]
Нет, я не использую minishop. У меня нет плейсхолдера +price, у меня только *price.
Если я из выше представленного кода убираю вызов сниппета, то у меня все выводится, что находится в then, если я сниппет обратно вставляю в then, то у меня ничего не выводится.
У меня и вопрос, почему так происходит?
Если я из выше представленного кода убираю вызов сниппета, то у меня все выводится, что находится в then, если я сниппет обратно вставляю в then, то у меня ничего не выводится.
У меня и вопрос, почему так происходит?
Хм, возможно, дело в результате вывода [[!AjaxForm]].
Вы можете для проверки поместить все содержимое then в отдельный чанк и вызвать модификатор в виде :then=`[[$название_чанка]]`?
Вы можете для проверки поместить все содержимое then в отдельный чанк и вызвать модификатор в виде :then=`[[$название_чанка]]`?
Так тоже делал.
Сейчас поставил вызов сниппета без параметров и все отобразилось. Как будто из-за кавычек все ломается, а их реально как-нибудь экранировать?))
Сейчас поставил вызов сниппета без параметров и все отобразилось. Как будто из-за кавычек все ломается, а их реально как-нибудь экранировать?))
Если честно, не уверен..)
Вы можете написать простенький сниппет проверки, который заодно и решит проблему с постоянной обработкой AjaxForm вне зависимости от значения price:
[[! название_сниппета? &check=`[[*price]]` &acceptValue=`0` &tpl=`название_чанка_который_нужно_отобразить`]]
Код:
Вы можете написать простенький сниппет проверки, который заодно и решит проблему с постоянной обработкой AjaxForm вне зависимости от значения price:
[[! название_сниппета? &check=`[[*price]]` &acceptValue=`0` &tpl=`название_чанка_который_нужно_отобразить`]]
Код:
<?php
if ($check == $acceptValue) {
return $modx->getChunk($tpl);
}
else {
return;
}
Подожду сегодняшнего вечера, вдруг кто скажет ответ.
Ну а потом уже если будет тихо, то можно будет и «костыли-сниппеты» писать.
Спасибо за идею :)
Ну а потом уже если будет тихо, то можно будет и «костыли-сниппеты» писать.
Спасибо за идею :)
Попробуйте вызвать AjaxForm с набором параметров. Создайте свой набор параметров и вызывайте с ним.
Точно! Совсем забыл про наборы параметров. Тем самым кавычки сами ушли. Спасибо :)
Решилась пролема?
«Костыли-сниппеты» — это такие вложенные вызовы. Из-за особенностей работы парсера необходимо избегать подобной вложенности. Либо через чанки (в простых случаях), либо через сниппеты. Если уж хочется использовать логику в шаблонах, смотрите в сторону Fenom — он больше возможностей предоставит.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.