Пан Евгениус: Блог разработчика. 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" в зависимости от нашего выбора. Это надуманный пример, но удобен для начального понимания того как работает поле Возможные значения: разделяет содержимое по знаку "||" и выводит их пунктами в списке выбора.3. Вывод пункта из динамического списка. Тут мы подходим к самому интересному:для меня, в свое время, открытием было то, что в поле Возможные значения можно не только написать какое-то статическое содержимое, но ввести исполняемый код:SQL:
Выборка из БД с помощью "@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
Привет всем читателям 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