в MODx CMS, Разработка

MODx Revolution — условия с несколькими вариантами выбора

Каждый разработчик сталкивался с ситуацией, когда нужно сделать проверку для вывода информации по нескольким условиям.

Например, если a=b или a=c или b=e, то f=m. Не важно какое равенство и какие переменные. Чаще всего это оказывается нужным для страниц, например если текущий ID документа равен 1 или 2 или 43, то происходят какие-то разные действия.

Условные конструкции реализуются с помощью PHx или сниппета If. Рассмотрим реализацию через сниппет If:

[[!If? &subject=`[[*id]]` &operator=`in_array` &operand=`1, 2,43` &then=`

[[!If? &subject=`[[*id]]` &operator=`in_array` &operand=`1`  &then=`какое-то_действие`]]

[[!If? &subject=`[[*id]]` &operator=`in_array` &operand=`2`  &then=`какое-то_действие`]]

[[!If? &subject=`[[*id]]` &operator=`in_array` &operand=`43`  &then=`какое-то_действие`]]

` &else=`

какое-то_действие

`]]

&operator=`in_array` — говорит о том, что у нас массив значений, одному из которых будет равен наша ID страницы. Его можно использовать и при одном значении.

Далее мы снова пишем условия, но уже проверям на конкретное одно значение.

В конце ставим else — какое-то действие по умолчанию, если ни одно условие не выполняется. Сама конструкция логична, но не все могут сразу ее вывести. Надеюсь кому-то будет полезно.

Написать комментарий

Комментарии

  1. Скажите, а можно ли данную конструкцию использовать, если мне просто нужно выводить нужный чанк в зависимости от ID страницы?
    Пример:
    если верно ID=`22` то выводится {{chank}}

    …просто ищу-ищу, а найти не могу как это сделать.

  2. …в продолжение:
    если быть точным то я хочу менять чанки в зависимости от ID страницы. Можно конечно создать кучу шаблонов (благо их всего шесть видов нужно), но хочется как то упростить этот процесс (на деле конечно получилось, что усложнил). Чтобы шаблон один был, а нужный чанк выводился на нужной странице…вот.

    • Можно.
      Нужно указать одно условие на каждый чанк, то есть если id=1, то выводим чанк такой-то и тд, без else.

      [[!If? &subject=`[[*id]]` &operator=`in_array` &operand=`1` &then=`[[$chank]]`]]

      Условие читается так: если текущий ID равен 1, то выводим чанк.
      Соответственно, если нужно несколько условий для вывода разных чанков под разные страницы, то нужно написать несколько проверок.
      Если условие не совпадает, то система ничего не выводит.

  3. Жаль нельзя сделать «and if». Вместо єтого пришлось извращатся и сделал такую конструкцию

    [[If? &subject=`[[*parent]]`
    &operator=`ia`
    &operand=`21,132,133`

    &then=`[[$vmenuid-inner]]`
    &else=`
    [[If? &subject=`[[*id]]`
    &operator=`ia`
    &operand=`21,132,133`
    &then=`[[$vmenuid-inner]]`
    &else=`295,296,513,550,556`
    ]]
    `
    ]]

    где [[$vmenuid-inner]] єто

    [[If? &subject=`[[*parent]]`
    &operand=`21`
    &then=`280,281,282,283,284,285,286,532,533` ]]
    [[If? &subject=`[[*id]]`
    &operand=`21`
    &then=`280,281,282,283,284,285,286,532,533` ]]
    [[If? &subject=`[[*parent]]`
    &operand=`133`
    &then=`110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126` ]]
    [[If? &subject=`[[*id]]`
    &operand=`133`
    &then=`110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126` ]]
    [[If? &subject=`[[*parent]]`
    &operand=`132`
    &then=`239,240,242,243,244,245,246,247,248` ]]
    [[If? &subject=`[[*id]]`
    &operand=`132`
    &then=`239,240,242,243,244,245,246,247,248` ]]