суббота, 11 апреля 2015 г.

MODX TV Список(Множественный и одиночный выбор). Применение возможностей @EVAL, @SELECT

TV в MODX является очень мощным инструментом, у которого куча возможностей: от стандартных и вполне очевидных и до тех, на какие у вас хватит фантазии, ведь в доп. полях практически нет никаких ограничений. Я например не могу себе представить то, что нельзя замутить с помощью TV(в разумных пределах естественно).

Существует несколько стандартных типов ввода в TV, которые позволяют выводить в админке списки из различных пунктов для выбора(одиночного или множественного). 
Они дают возможность контент менеджеру выбрать из предложенного списка какой либо пункт:

Или несколько пунктов:
А вы, как разработчик сайта, можете использовать полученное значение выбора как вам заблагорассудится:

1. Просто вывод выбранного текста
Можно,например, использовать при вводе в Возможные значения такого содержимого: 
Из админки это будет выглядеть так:
И, например, при вводе в шаблон ресурса [[*example-choice]]  в нужном месте мы, при открытии страницы, получим "Текст для вывода 1" или "Текст для вывода 2" в зависимости от нашего выбора.
Это надуманный пример, но удобен для начального понимания того как работает поле Возможные значения: разделяет содержимое по знаку "||" и выводит их пунктами в списке выбора.

2. Использование значения для режима вывода содержимого на странице можно реализовать если ввести что-то подобное в возможные значениях:
Из админки это, будет выглядеть так:
Таким образом MODX берет из поля Возможные значения содержимое, делит его по знаку "||", и к тому же каждый поделенный пункт делит еще по знаку ==, беря первую часть(например "Маленький слайдер") как текст для списка, который видит пользователь админки, а вторую часть("small") как значение, которое будет выводится, когда мы будем запрашивать значение нашего TV: [[*slider-type]] выведет small.
Теперь мы можем добавить примитивную логику в наш шаблон странички, с помощью фильтров MODX, чтобы выводить маленький или большой слайдер в зависимости от выбора:
[[*slider-type:is=`small`:then=`[[$SmallSlider]]`:else=`[[$BigSlider]]`]]
Здесь уже пример более приближен к реальности, и взят из реального проекта.

3. Вывод пункта из динамического списка. Тут мы подходим к самому интересному:
для меня, в свое время, открытием было то, что в поле Возможные значения можно не только написать какое-то статическое содержимое, но ввести исполняемый код:
SQL:
 или PHP:

Достаточно просто прописать ключевое слово вначале "@SELECT" для SQL, и "@EVAL" для PHP.
Как видно на первом скрине с SQL кодом: в нем я просто выбираю список ресурсов из БД, у которых родитель с id 53, и шаблон с id 19. Для вывода списка ресурсов по идее предназначен соответствующий тип вывода "Список ресурсов"(он и правильнее для этой цели с точки зрения реализации с помощью AJAX подгрузки по поиску), но дело в том что в нем нет возможности выбора нескольких пунктов сразу, как на 2-м скрине из этой статьи, на нем вы можете посмотреть результат вывода пунктов с помощью SELECT:

Выборка из БД с помощью "@SELECT" не требует дополнительных усилий по оформлению в отличие от "@EVAL" подхода, в нем нам необходимо с помощью какого-либо сниппета для вывода списка(в данном случае getImageList от MIGX, но можно использовать и всем хорошо знакомый getResources) привести наш массив пунктов к уже знакомому виду: "Значение 1==value1||Значение 2==value2".
Только в данном случае мы к началу добавляем еще один пункт "- Выберите Вопрос - Ответ==||", который будет выдавать нам пустое значение при его выборе.
Как я уже сказал последний пример использования поля Возможные значения содержит код, использующий сниппет getImageList для получения списка пунктов из MIGX таблички в каком-либо ресурсе, что по-моему очень круто и для некоторых случаев удобно: когда какая либо информация не заслуживает отдельного ресурса(не должна иметь собственную страницу и имеет пару полей для заполнения) как в моем случае вопрос - ответ:

Но в тоже время есть потребность выбирать нужный вопрос-ответ для вывода в подвале(например как на моем 2-м скрине в этой статье).

Кстати: при использовании Списка(множественный выбор) следует выбрать тип вывода: "Разделитель" и  ввести запятую: "," в предложенное поле:
тогда при выборе, например, нескольких ресурсов в нужном месте у вас будет выводится что-то подобное: "93,95,97". Такую форму вывода можно использовать например в сниппете getResources:
[[!getResources? &parents=`-1` &resources=`[[*multi-docs]]` &tpl=`myRowTpl`]]

Как видите поле Возможные значения - очень мощный, гибкий и довольно удобный инструмент, который показывает только малую часть того, что может TV в MODX.
Поле Значение по умолчанию тоже по идее может использоваться как динамический вывод какой-то информации, самый простой пример:

который выводит текущее время, при загрузке страницы, однако данный способ будет нормально работать только если в настройках ресурса поставить некешируемый вызов:

иначе время будет не актуально. Но нужно понимать что так делать не правильно, ведь подобную задачу обычно выполняют сниппеты, не смотря на это можно придумать и что-то более подходящее для доп. поля, допустим: если создать скрытый TV(migx-table-summ) по соседству с MIGX TV(migx-table), и в поле Значение по умолчанию migx-table-summ ввести некоторый код, который из таблицы MIGX берет значения из одного из столбцов(например цена), умножает на значение из другого столбца(например количество) то можно выводить и получать результирующую сумму из таблицы migx-table просто вызвав TV в теле шаблона ресурса: [[*migx-table-summ]].
Хотя это довольно спорный момент, скорее всего очевиднее было бы писать подобный код в теле какого-либо сниппета, и вызвать его например так: [[*migx-table:calcSumm]], но полезно знать что есть такая возможность, так как она может пригодится.
Вышепреведенный код можно найти в моем репо:
https://github.com/Jonybang/ModX-tehniques/tree/master/dynamic-select
Ссылки:
Документация по @SELECT
Input и Output фильтры в MODX
Обсуждение по вводу в Возможные значения исполняемого кода
Документация по @EVAL который можно практически в любом месте использовать в MODX
Использование SQL в Возможных значениях

1 комментарий:

  1. А как вывести название маленький слайдер в шаблоне, а не только в админке?

    ОтветитьУдалить