Вызов сниппета внутри фильтра(модификатора)

Доброй ночи.
Подскажите пожалуйста, как вызывать сниппет внутри фильтра(модификатора)?
Есть карточка товара, там я проверяю наличие товара, если товара нет, то надо показывать форму «оповещение о появлении товара».
[[*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>
`]]
При заходе на страницу блок с фильтром вообще на странице не отображается.
Что собственно не так делаю?
Alexander Serezhin
06 октября 2015, 23:02
modx.pro
1
1 924
0

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

Максим Кузнецов
07 октября 2015, 02:11
0
Если вы используете minishop2 для формирования карточки товара, то вам необходим плейсхолдер не [[*price]], а [[!+price]]. В остальном все верно.

Единственный минус подобного решения — из-за специфики работы преобразования плейсхолдеров модкса, в вашем примере вначале выполняется содержимое внутри then (в любом случае, вне зависимости от значения price), а уже после — проверка условия. Что негативно сказывается на производительности, в случае, если количество товаров больше 0 и форма не нужна в принципе.
    Alexander Serezhin
    07 октября 2015, 02:14
    0
    В остальном все верно.
    Т.е. это нормальная работа modx, что если я хочу вызвать сниппет в модификаторе, то у меня на страницу вообще не выводится все содержимое модификатора???
      Максим Кузнецов
      07 октября 2015, 02:22
      0
      Что вы подразумеваете под содержимым модификатора?

      Сейчас у вас выполняется следующая логика:
      — обрабатывается содержимое внутри then=``
      — проверяется значение [[*price]] (если у вас minishop2, то такое значение в принципе не находит, т.к. там требуется иной плейсхолдер)
      — значение [[*price]] не равно 0 (так как его в принципе нет).
      — вам ничего не возвращает, так как нет условия :else=``

      Вот пример того, когда вам всегда вернется какой-либо результат:

      [[!+price:is=`0`:then=`Код формы`:else=`Цена на товар [[!+price]] рублей`]]
        Alexander Serezhin
        07 октября 2015, 02:24
        0
        Нет, я не использую minishop. У меня нет плейсхолдера +price, у меня только *price.

        Если я из выше представленного кода убираю вызов сниппета, то у меня все выводится, что находится в then, если я сниппет обратно вставляю в then, то у меня ничего не выводится.

        У меня и вопрос, почему так происходит?
          Максим Кузнецов
          07 октября 2015, 02:28
          0
          Хм, возможно, дело в результате вывода [[!AjaxForm]].

          Вы можете для проверки поместить все содержимое then в отдельный чанк и вызвать модификатор в виде :then=`[[$название_чанка]]`?
            Alexander Serezhin
            07 октября 2015, 02:29
            0
            Так тоже делал.
            Сейчас поставил вызов сниппета без параметров и все отобразилось. Как будто из-за кавычек все ломается, а их реально как-нибудь экранировать?))
              Максим Кузнецов
              07 октября 2015, 02:37
              1
              +1
              Если честно, не уверен..)

              Вы можете написать простенький сниппет проверки, который заодно и решит проблему с постоянной обработкой AjaxForm вне зависимости от значения price:

              [[! название_сниппета? &check=`[[*price]]` &acceptValue=`0` &tpl=`название_чанка_который_нужно_отобразить`]]

              Код:
              <?php
              	if ($check == $acceptValue) {
              		return $modx->getChunk($tpl);
              	}
              	else {
              		return;
              	}
                Alexander Serezhin
                07 октября 2015, 02:47
                0
                Подожду сегодняшнего вечера, вдруг кто скажет ответ.
                Ну а потом уже если будет тихо, то можно будет и «костыли-сниппеты» писать.

                Спасибо за идею :)
                  Igor Ivanov
                  07 октября 2015, 07:53
                  +1
                  Попробуйте вызвать AjaxForm с набором параметров. Создайте свой набор параметров и вызывайте с ним.
                    Alexander Serezhin
                    07 октября 2015, 10:49
                    0
                    Точно! Совсем забыл про наборы параметров. Тем самым кавычки сами ушли. Спасибо :)
                      Олег
                      01 февраля 2019, 15:56
                      0
                      Решилась пролема?
                  Воеводский Михаил
                  07 октября 2015, 11:34
                  0
                  «Костыли-сниппеты» — это такие вложенные вызовы. Из-за особенностей работы парсера необходимо избегать подобной вложенности. Либо через чанки (в простых случаях), либо через сниппеты. Если уж хочется использовать логику в шаблонах, смотрите в сторону Fenom — он больше возможностей предоставит.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    12