Вывод в зависимости от содержимого плейсхолдера

Добрый день!
Подскажите, пожалуйста, как выводить информацию в зависимости от содержимого плейсхолдера?
В данный момент информация выводится таким образом:

[[!+availability:gt=`0`:then=`<div class="available">[[+availability]]</div>`:else=``]]
Если в miniShop2 характеристика [[+availability]] не заполнена, то ничего не выводится, если выбрано какое-либо значение, то выводится
<div class="available">[[+availability]]</div>

Опция [[+availability]] имеет 2 значения «Есть в наличии» и «Под заказ». Подскажите, какая должна быть конструкция, чтобы при выборе значения «Есть в наличии» выводился div с классом class=«available», а при выборе значения «Под заказ» class=«not_available»?

Решение:

[[!+availability:gt=`0`:then=`[[!+availability:is=`Под заказ`:then=`<div class="not_available">[[+availability]]</div>`:else=`<div class="available">[[+availability]]</div>`]]`:else=``]]
Victor
30 октября 2015, 11:21
modx.pro
2
1 481
0

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

Алексей
30 октября 2015, 18:50
0
Вы не пробовали узнать, откуда берется значение плэйсхолдера?

Уж с конструкцию привели ради смены css класса, одного (!?)
    Алексей
    30 октября 2015, 18:58
    0
    К примеру как я вижу, есть разные чанки для оформления одного блока страницы.

    Причем отличия в них могут быть гораздо более сложными чем [[+plsname]]cssstyle, где в зависимости от значения возвращается пустая строка или not_, (продолжил логику вашего примера).

    То есть лучше хранить два дива в разных чанках, и уже в сниппете реализовывать логику, какой показывать.

    Приеду домой поковыряю магазин, не верю, что нет более простого и гибкого пути решения вашего вопроса.
      Victor
      30 октября 2015, 19:04
      0
      Более простого я не придумал (
      but1head
      30 октября 2015, 19:24
      1
      0
      [[+availability:availability]]
      Сниппет availability
      <?php
      
      $availability = $input; (ваш плейсхолдер)
      $output = '';
      switch($availability){
      	case 0: $output = 'равен 0'; break;
      	case 1: $output = 'равен 1'; break;
      	case 'Под заказ': $output = 'только под заказ';
      	default: $output = 'ни равен ничему'; break;
      }
      return $output;
        Антон Пастухов
        30 октября 2015, 19:38
        0
        Если принципиально обойтись встроенными фильрами, то можно попробовать типа такого:
        [[!+availability:is=`Есть в наличии`:then=`<div class="available">[[+availability]]</div>`:else=`[[!+availability:is=`Под заказ`:then=`<div class="not_available">[[+availability]]</div>`]]`]]
        Монструозно, конечно. Но в стандарных фильтрах нет «else if», поэтому так.
        Лучше написать фильтр и скормить ему значение. Например, так: [[+availability:process]], и сделать сниппет process, в котором уже нормально все обработать:

        if (! empty($input)) {
            if ($input == 'Есть в наличии') {
                $class = 'available'; 
            } else {
                $class = 'not_available';
            }
        
            return "<div class='$class'>$input</div>";
        }
          Victor
          30 октября 2015, 19:45
          0
          Ну по сути в моем варианте я и использую подобную конструкцию, только там есть еще условие, что ничего не выбрано.

          Делать это встроенными фильтрами или сниппетом — не принципиально, вопрос в том, что будет быстрее работать?
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7