Пан Евгениус: Блог разработчика. Modx tv checkbox по умолчанию


Использование галочки (Checkbox) и списка (одиночный выбор) в TV-параметре MODx

Бывают ситуации, когда у нас есть шаблон и хотелось бы просто добавить на пару страниц кое-что, выходящее за рамки шаблона. Один из вариантов - использование TV-параметра типа Checkbox. Задача чтобы было все просто - поставил "галочку" в дополнительных полях документа и выводится, к примеру, содержание чанка. Если галочка не стоит - не выводится.

Задача решается элементарно:

Для начала обрисуем ситуацию — у нас есть шаблон, такого содержания:

<http><head></head><body><h2>Заголовок</h2><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></body></http>

Одиночный вариант:

Выводить или не выводить заголовок.

Создаем чанк с именем header-h2, внутрь него помещаем <h2>Заголовок</h2>

Создаем TV-параметр типа Флажки (checkbox), называем его power-galka-h2 и в настройках (в поле "Возможные значения") пишем примерно так (и не забываем указать, шаблоны во вкладке "Доступно для шаблонов"):

Заголовок==[ [$header-h2]]

Помещаем TV-параметр в шаблон:

<http><head></head><body><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></body></http>

Галочку можно увидеть и пощелкать во вкладке "дополнительные поля" у вашего документа. Механика проста - если галка стоит - выводится то, что мы прописали в "возможном значении", если не стоит - не выводится:)

Множественный вариант:

Хотим чтобы к заголовку могли добавляться прилагательные - "Емкий" или "Cодержательный", или не добавлять ничего.

Создаем два чанка - [ [$var1]] и [ [$var2]], внутри которых будет содержаться текст- "Емкий" и "Cодержательный".

Создаем TV-параметр типа Список (одиночный выбор), называем его power-list и в настройках (в поле "Возможные значения") пишем примерно так:

Отображаемое значение первой кнопки==[ [$var1]]||Отображаемое значение второй кнопки==[ [$var2]]

Помещаем TV-параметр в шаблон:

<http><head></head><body><h2>Заголовок [ [*power-list]]</h2><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p></body></http>

Готово!

Комментарии (0)

about-cms.com

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 Ссылки:Документация по @SELECTInput и Output фильтры в MODXОбсуждение по вводу в Возможные значения исполняемого кодаДокументация по @EVAL который можно практически в любом месте использовать в MODXИспользование SQL в Возможных значениях

jonybang.blogspot.com

Топики с тегом tv

Привет всем читателям ModxClub, первым делом пользуясь случаем хочу поздравить и мало-ли кому напомнить о том что наступил новый год ;)

В поисках истока решения по поводу выборки ресурсов с критериями по значению их Телевизоров «Дополнительных полей(Template Variables/TV)», не смог найти именно корень этой возможность и в чем она проявляется, а именно сейчас будет кому-как покажется, средней сложности SQL запрос.

Раньше ведь мы могли(я мог=D) только взять ресурс и припасти все его TV параметры, но зачем тогда нужна сама таблица modx_site_tmplvar_contentvalues? я недоумевал, да и не было времени у меня чтобы вникнуть в вопрос самостоятельно, ведь разрабы Modx могли обеспечить хранение значений или даже ключей+значений конкретного ресурса через поле modx_site_content.properties которое хранит через xPDO JSON массив.

Я припас запрос SQL который может решить задачи посредством вложенных SELECT значений: для меня была задача поставить запрос таким образом — что-бы запрос был шаблонным и имел любые возможности построения критерий по ключ=значение, точно так-же как и обычная выборка ресурсов с их условиями.

SELECT * FROM `modx_site_content` LEFT JOIN `modx_site_tmplvar_contentvalues` ON `modx_site_tmplvar_contentvalues`.`contentid` = `modx_site_content`.`id` WHERE ( `modx_site_tmplvar_contentvalues`.`tmplvarid` = ( SELECT `modx_site_tmplvars`.`id` FROM `modx_site_tmplvars` WHERE `modx_site_tmplvars`.`name`='icon' ) AND `modx_site_tmplvar_contentvalues`.`value` = 'example-icon' ) OR ( `modx_site_tmplvar_contentvalues`.`tmplvarid` = ( SELECT `modx_site_tmplvars`.`id` FROM `modx_site_tmplvars` WHERE `modx_site_tmplvars`.`name`='isCosmos' ) AND `modx_site_tmplvar_contentvalues`.`value` = 'IS' )

Главное чтобы код отображался в исходном формате и желательно с подсветкой, а-то подумают что я криворучкиц патцан)))) Код SQL запроса в принципе демонстрирует корень того как можно просто ставить критерии на дополнительные поля при обращении за modResource коллекцией или просто объектом.

Первым делом JOIN`имся в таблицу Значений дополнительных полей

LEFT JOIN `modx_site_tmplvar_contentvalues`

соответственно сопоставляя ресурс и ссылку с таблицы TV на этот ресурс.

ON `modx_site_tmplvar_contentvalues`.`contentid` = `modx_site_content`.`id`

Далее идет тот самый шаблонный метод становления критерии

WHERE ( `modx_site_tmplvar_contentvalues`.`tmplvarid` = ( SELECT `modx_site_tmplvars`.`id` FROM `modx_site_tmplvars` WHERE `modx_site_tmplvars`.`name`='icon' ) AND `modx_site_tmplvar_contentvalues`.`value` = 'example-icon' ) OR ( `modx_site_tmplvar_contentvalues`.`tmplvarid` = ( SELECT `modx_site_tmplvars`.`id` FROM `modx_site_tmplvars` WHERE `modx_site_tmplvars`.`name`='isCosmos' ) AND `modx_site_tmplvar_contentvalues`.`value` = 'IS' )

Разделю это на части, здесь 1 блок в скобках = 1 критерию по полю, опишу блок подробнее:

( `modx_site_tmplvar_contentvalues`.`tmplvarid` = ( SELECT `modx_site_tmplvars`.`id` FROM `modx_site_tmplvars` WHERE `modx_site_tmplvars`.`name`= <abbr title="icon">{%ИМЯ_TV_ПАРАМЕТРА%}</abbr> ) AND `modx_site_tmplvar_contentvalues`.`value` {&ОПЕРАТОР_ВЫРАЖЕНИЯ&} {%ИСКОМОЕ_ЗНАЧЕНИЕ_TV%} )

Далее, после 1ого блока — идет оператор OR — это сопоставимо WHERE условию —

WHERE `column` = 'value' OR ... bla bla where statements

UPD1: Оператор AND пока не допустим, я ушел в поиск решения для этой возможности /END_UPD UPD2: Альтернатива более лучший вариант:

SELECT * FROM `modx_site_content` AS `resource` WHERE ( `resource`.`id` IN ( SELECT `val`.`contentid` FROM `modx_site_tmplvars` AS `tv` LEFT JOIN `modx_site_tmplvar_contentvalues` AS `val` ON `tv`.`id` = `val`.`tmplvarid` WHERE ( (tv.name = 'icon' AND val.value = 'example-icon') OR (tv.name = 'isCosmos' AND val.value = 'IS') ) ) )

Еще не думал о оптимизации этого отрывка, просто здесь по логике чем больше критерий по TV — тем больше вложенных SELECT получается, Я пока не знаю как это отразится на производительности

Код выдумал буквально только-что)

Все это дело я еще не впихивал в xPDO реалии, но как многие знают в нем есть возможность подготовки критерии из нативного SQL,

modxclub.ru


Prostoy-Site | Все права защищены © 2018 | Карта сайта