Переменные шаблона TV в CMS MODX

Содержание:
  1. Что такое переменные шаблона (TV)
  2. Создание TV (дополнительных полей)
  3. Вывод TV (дополнительных полей)
  4. Комментарии

Статья, в которой рассмотрим назначение TV параметров и основные принципы работы с ними в MODX Revolution.

Что такое переменные шаблона (TV)

По умолчанию любой ресурс в MODX Revolution имеет определённый набор полей: pagetitle (заголовок), content (содержимое), description (описание) и т.д.

Поля, которые имеет любой ресурс (документ) в MODX Revolution по умолчанию

Но кроме встроенных полей с каждым ресурсом можно ещё связать (добавить к нему) любое количество других полей. Осуществляются эти действия в MODX Revolution посредством TV переменных. Связывание TV параметров с ресурсами выполняется не напрямую, а через шаблоны. Т.е. для того чтобы дополнительное поле появилось у ресурса, соответствующий TV параметр должен быть связан с его шаблоном. Из-за этого данные переменные и называются TV, т.е. переменными шаблона (Template Variable).

Создание TV (дополнительных полей)

Рассмотрим, как в MODX Revolution с помощью TV-переменных можно расширить назначение стандартных ресурсов (документов). Например, разберём какие TV поля необходимо добавить к ресурсам, чтобы их можно было использовать, для представления книг на сайте.

В MODX создание TV параметров осуществляется очень просто, посредством выполнения следующих шагов:

  1. Войти в админку (менеджер) MODX Revolution.
  2. Перейти в левой панели во вкладку "Элементы" и нажать на кнопку "Новое дополнительное поле". Поля, которые имеют любой ресурс (документ) MODX по умолчанию
  3. В открывшейся странице ввести имя дополнительному полю, например, authors. Данное поле будем использовать для хранения авторов книги. Создание TV-поля в MODX Revo (задание имени)
  4. Перейти на вкладку "Параметры ввода" и указать необходимый формат данных, который будет определять тип значения, которое может быть помещено в этот TV параметр. Для TV переменной authors установим тип значения ввода, равный "текст".
  5. В секции "Параметры вывода" следует задать формат, в котором необходимо выводить данные из этого поля. Например, TV параметр authors будем выводить в формате текста. Для этого ему установим соответствующее значение в качестве значения параметра "Тип вывода".
  6. В разделе "Доступно для шаблонов" необходимо выбрать те шаблоны, через которые TV поле появится у соответствующих ресурсов. Процесс привязывания TV поля к ресурсам (через соответствующие шаблоны)

Для примера создадим ещё несколько TV параметров: release-year (год выпуска), quantity-of-pages (количество страниц), cover-photo-book (фото обложки книги). Привяжем TV поля к тому же шаблону (например, шаблон книги).

Заполнение TV полей при создании или редактировании ресурсов

После создания TV полей они становятся доступными во время создания или редактирования соответствующих ресурсов. Располагаются TV-поля на страницах ресурсах по умолчанию во вкладке "Дополнительные поля".

Дополнительные поля, которые появились у ресурсов с установленным шаблоном книга

Более удобного расположить TV поля на страницах определённых ресурсов можно с помощью инструмента MODX Revo "Настройка форм" (значок "Шестерёнка" в главном меню админки -> пункт "Настройка форм").

Некоторый результат, который можно достигнуть путём применения определённого набора правил к соответствующим ресурсам (через шаблон) с помощью элемента MODX "Настройка форм".

Расположение TV переменных у ресурса, представление которого было настроено с помощью инструмента, который называется настройка форм

Вывод TV (дополнительных полей)

В MODX вывод значения TV переменной, связанной с текущим ресурсом, осуществляется также как и любого другого поля этого ресурса.

Например, получим значение TV поля authors у текущего ресурса (в шаблоне):

[[*authors]]

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

[[!pdoResources?
  &parents=`[[*id]]`
  &includeTVs=`authors,cover-photo-book,quantity-of-pages,release-year`
  &tpl=`@INLINE
    <h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
    <ul>
      <li>Автор(ы): [[+tv.authors]]</li>
      <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
      <li>Год выпуска: [[+tv.release-year]]</li>
    </ul>
    <img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
  `
]]

То же самое действие, но уже с использованием сниппета getResources:

// вызов сниппета getResources
[[!getResources?
  &parents=`[[*id]]`
	&includeTVs=`1`
	&tpl=`book`
]]

// содержимое чанка book:
<h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
<ul>
  <li>Автор(ы): [[+tv.authors]]</li>
  <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
  <li>Год выпуска: [[+tv.release-year]]</li>
</ul>
<img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
Вывод всех дочерних ресурсов (по отношению к текущему) вместе со значениями их TV-полей

MODX - Использование в условии where TV переменных

Например, следующий код показывает, как можно выбрать книги (ресурсы), в зависимости от некоторого условия (поле автор должно содержать значение "Резиг"). Условия в сниппете pdoResources задаются с помощью параметра where.

[[!pdoResources?
  &parents=`[[*id]]`
  &includeTVs=`authors,cover-photo-book,quantity-of-pages,release-year`
  &tpl=`@INLINE
    <h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
    <ul>
      <li>Автор(ы): [[+tv.authors]]</li>
      <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
      <li>Год выпуска: [[+tv.release-year]]</li>
    </ul>
    <img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
  `
  &where=`{"authors:LIKE":"%Резиг%"}`
]]

Сортировка ресурсов по TV полю

Для сортировки ресурсов в MODX Revo в зависимости от того какое значение имеет TV поле можно выполнить с помощью параметра сниппета pdoResources sortby.

Например, выведем книги по году выпуска (по убыванию):

[[!pdoResources?
  &parents=`[[*id]]`
  &includeTVs=`authors,cover-photo-book,quantity-of-pages,release-year`
  &tpl=`@INLINE
    <h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
    <ul>
      <li>Автор(ы): [[+tv.authors]]</li>
      <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
      <li>Год выпуска: [[+tv.release-year]]</li>
    </ul>
    <img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
  `
  &sortby=`release-year`
  &sortdir=`DESC`
]]

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

Гарри
Гарри
Добрый день!

Возник вопрос по поводу вывода tv, имеющего множественное значение.
Вкратце, схема такова:
Есть список продуктов. Привязка продуктов к рецептам реализована через tv типа checkbox, названное product-to-recipe.
Есть список рецептов. Привязка рецептов к продуктам реализована через tv типа checkbox, названное recipe-to-product.
Оба tv имеют возможность выбора нескольких значений и шаблон вывода delimiter.
А вот как теперь «расклеить» вывод нескольких значений этих tv (то есть, разделить их, убрав ||) — чтото я не догоню никак. Только через решение со сниппетом, или всё-таки есть другие варианты?
Гарри
Гарри
Тема давно реализована… но оставлю, вдруг кому понадобится.

Проблема решается через фильтры ввода-вывода. Оказалось достаточно в TV прописать коротЕнькую запись и всё встало на места.
Пример —
<div class="text-[[+tv.myTVs:replace=`||== text-`]]">some text</div>
Если содержимое TV — числовые значения, результат примера — столько классов с числовым значением, сколько значений прописано в TV. Потенциал решения, думается, понятен…
Анна
Анна
Уже настроено нужное дополнительное поле TV, но в одном шаблоне нужно дважды его использовать? Это возможно или необходимо делать такое же еще раз и уже его добавлять?
и второй вопрос — как менять расположение блоков на странице? в шаблоне или на странице категории? не нахожу нигде prnt.sc/13o0n52

MODX Revolution 2.8.1-pl
Алексей
Алексей
Добрый день, Александр. Почитал вашу статью и возник такой вот вопрос, а для меня помощь как начинающему. У меня есть архив новостей(pdoArchive), я сделал так чтобы они выводились, только если они неопубликованные. Проблема в том, что при снятие поле publishedon становится пустым и дата в pdo 1970. Я думал, может создать некое tv поле и прировнять значения publishedon, но не знаю как это сделать и чтобы оно срабатывала только один раз при создание новости. Или возможно просто обойтись без Pdo, а просто дочерние ресурсы новостей (колекция) перемещать в другой ресурс, но моих знаний тут не хватает. Имеется снимет, но он чего нето не работает
$articles = $modx->getCollection('modResource', array('parent'=>вот тут откуда взять));
$today =  new DateTime();
foreach($articles as $article){
$pub = new DateTime ($article->get('publishedon');
if($today->diff($pub, 1) > 30){
$article->set('parent', тут куда положить);
$article->save();
}
}
Подскажите как сделать лучше?
Алексей
Алексей
[[!pdoPage?
    &element=`pdoArchive`
    &parents=`3`
    &limit=`20`
    &maxLimit=`20`
    &showUnpublished=`1`
    &scheme=`uri`
    &sortby=`publishedon`
    &dateField=`publishedon`
    &where=`{"publishedon":0}`
    &tplDay=`@INLINE <li><span style="font-size:22px;font-weight:700;">[[+day]] <sup>([[+count]])</sup></span><ul>[[+wrapper]]</ul></li>`
    &tplYear=``
    &tplMonth=`@INLINE <h4>{$month_name} {$year} <sup>({$count})</sup></h4><ul>{$wrapper}</ul>`
    &tpl=`@INLINE <li><b>{$date}.</b> <a style="color:#3993e2;" href="{$link}">{$menutitle}</a> <br /> <small class="label-custom label-lg-custom label-rounded-custom label-primary">{$section}</small></li>`
    &leftJoin=`{
        "Parent": {
            "class": "modResource"
        }
    }`
    &select=`{
        "modResource": "*",
        "Parent":"Parent.pagetitle as section"
    }`
]]
[[!+page.nav]]
это код вывода, ни как не могу сделать дату постоянно 1970
Антон
Антон
Друзья, я новичок в MODX, нужна ваша помощь!

Использую mFilter2 для фильтрации ресурсов, возникла проблема с отображением TV полей ресурса при результатах фильтрации (просто в категориях и в карточке товара все ок отображается), проблема именно в результатах фильтрации.

[[!mFilter2?
					&limit=`50`
					&parents=`28`
					&includeTVs=`image`
					&resources =``
					&setMeta=`1`
					&showLog=`1`
					&filters=`
                    tv|value1,
                    tv|value2,
                    tv|value3,
                    tv|value4,
                    tv|datnews,
                    tv|image,
                    `
                    &showEmptyFilters=`0`
                    &aliases=`
                        tv|value1==value1,
                        tv|value2==value2,
                        tv|value3==value3,
                        tv|value3==value4,
                        tv|datnews==datnews,
                        tv|image,
                        resource|createdby==author
                    `	 
                    &tpl=`wika_categoryTpl`
                    &tplOuter=`tpl.mFilter2.outer` 
                    &tplFilter.outer.category=`tpl.mFilter2.filter.outer.category`
                    &tplFilter.row.category=`tpl.mFilter2.filter.option.category`	       
                    &suggestionsRadio=`tv|category`

				]]
Код чанка wika_categoryTpl:

<div class="col-sm-12 col-md-6 col-lg-6 item-category-catalog">
    <a href="[[++site_url]][[~[[+id]]]]" class="link-item-category">
        <div class="col-sm-12 col-md-4 col-lg-4 image-item-category-catalog">
            <img src="[[+tv.image]]" />
        </div>
        <div class="col-sm-12 col-md-8 col-lg-8 text-item-category-catalog">
	        <p class="title-link-item-catalog">[[+pagetitle]]</p>
	        <p class="short-text-link-item-catalog">[[+introtext]]</p>
	        <span class="link-more-item-catalog">Подробнее</span>
	    </div>
    </a>
</div>
Проблема с отображаем img — [[+tv.image]]. Все остальное выводится. Доступы стоят для доп. поля в шаблонах.

Весь день голову ломаю, решения не нашел. Помогите, пожалуйста.

Лог выводится такой:

0.0019450: pdoTools loaded.
0.0003622: Query parameters are prepared.
0.0000319: xPDO query object created
0.0004330: Included list of tvs: image
0.0005741: leftJoined mseIntro as Intro
0.0002990: leftJoined modTemplateVarResource as TVimage
0.0000041: Grouped by modResource.id, Intro.intro
0.0000482: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000210: Added selection of mseIntro: intro
0.0000110: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `image`
0.0000350: Processed additional conditions
0.0003250: Added where condition: modResource.id:IN(29,30,31,32,33), modResource.published=1, modResource.deleted=0
0.0000100: Replaced TV conditions
0.0001509: Sorted by FIELD(`modResource`.`id`,'29','30','31','32','33'), 
0.0000029: Limited to 50, offset 0
0.0002911: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, `intro`, IFNULL(`TVimage`.`value`, '') AS `image` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_mse2_intro` `Intro` ON modResource.id = Intro.resource LEFT JOIN `modx_site_tmplvar_contentvalues` `TVimage` ON `TVimage`.`contentid` = `modResource`.`id` AND `TVimage`.`tmplvarid` = 1 WHERE  ( `modResource`.`id` IN (29,30,31,32,33) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 )  GROUP BY modResource.id, Intro.intro ORDER BY FIELD(`modResource`.`id`,'29','30','31','32','33') LIMIT 50 "
0.0012100: SQL executed
0.0000710: Total rows: 5
0.0000620: Rows fetched
0.0001149: Returning raw data
0.0060761: Total time
8 912 896: Memory usage
0.0028400: pdoTools loaded.
0.0076590: Fetched 5 ids for building filters from element "mSearch2"
0.0000072: Total number of results: 5
0.0000029: Getting filters for 5 ids
0.0032990: Total number of filters: 7
0.0033209: Suggestions retrieved.
0.0213320: Fired paginator: "pdoPage"
0.0000072: Filters retrieved
0.0010428: Loaded "modChunk" with name "tpl.mFilter2.filter.checkbox"
0.0010660: Loaded "modChunk" with name "tpl.mFilter2.filter.outer"
0.0031941: Filters templated
0.0000081: Total filter operations: 7
0.0440509: Total time
9 175 040: Memory usage
Заранее спасибо!
Антон
Антон
Проблема решилась очень просто.

Указал в чанке вместо [[+tv.image]] — [[+image]] и все.
Александр Мальцев
Александр Мальцев
Отлично!
Антон
Антон
Александр, не подскажите, как можно отсортировать значения фильтров по порядковому номеру — как были добавлены.

Поясню:

Есть фильтр — множественный выбор, выводятся значения данного фильтра сейчас по алфавиту, как сделать чтобы по положению в админке выводились значения фильтра?

Спасибо.
Александр Мальцев
Александр Мальцев
Вроде таких настроек нет. Тут нужно копаться в исходных файлах и смотреть как это реализовано, и можно ли это изменить по-другому. С такой задачей не сталкивался, поэтому не подскажу. Если нет желание разбираться, то можно просто написать свою фильтрацию так как нужно.
Виталий
Виталий
помогите правильно написать условие &where

[[!pdoPage?
        &limit=`10`
        &pageLimit=`7`
        &parents=`1`
        &depth=`2`
        &tpl=`NewsItemTpl`
        &includeContent=`1`
        &hideContainers=`1`
        &includeTVs=`img,label-type,category`
        &where=`{"parent:=":"[[*id]]"}`]]
Так вывожу ресурсы текущей категории, но есть ещё TV-поле category, в котором указано, что ресурс принадлежит так же дополнительной категории. Это тоже нужно прописать в условиях.
&where=`{"category:=":"[[*id]]"}`]] 
— тоже работает, и выводит по TV- полю.

Как написать эти условия вместе?
Александр Мальцев
Александр Мальцев
Соединить условия в &where можно так:
[[!pdoPage?
  ...
  &where=`["parent = [[*id]] AND category = [[*id]]"]`
]]
Виталий
Виталий
&where=`["parent = [[*id]] AND category = [[*id]]"]`
так ничего не показывает…
Виталий
Виталий
&where=`["parent = [[*id]] OR category = [[*id]]"]`
это работает
Александр Мальцев
Александр Мальцев
Смотря что нужно. Если необходимо вывести ресурсы, у которых parent равно [[*id]] или category равно [[*id]], то так.
Amsterdam
Amsterdam
Добрый день Александр!

А как можно было бы вывести кириллические значения TV «множественный выбор» с «возможными значениями» Круг==circ||Квадрат==square||Треугольник==tri

При обычном выводе во фронт отдаются латинские значения
Александр Мальцев
Александр Мальцев
Добрый день!
В этой записи ключ располагается до «==», а значение после. При выводе значения TV на страницу, MODX конечно же выводит значения, а не ключи.

Если нужно наоборот, то кроме как писать свой сниппет для этого случая другого наверно решения нет.
Для этого создаём свой сниппет, например, outputMultipleTV со следующим кодом:
$delimiter = $modx->getOption('delimiter', $scriptProperties, ', ');

$tv = $modx->getObject('modTemplateVar', array('name' => $tvName));
$tvElements = explode('||', $tv->get('elements'));

$tvElementsArray = [];
$output = [];

$tvResource = $modx->getObject('modTemplateVarResource', array(
  'tmplvarid' => $tv->get('id'),
  'contentid' => $resourceId
));

if ($tvResource) {
  foreach ($tvElements as $tvElement){
    $item = explode('==', $tvElement);
    $tvElementsArray[$item[1]] = $item[0];
  }
  $tvValue = explode('||', $tvResource->get('value'));
  foreach ($tvValue as $item){
    $output[] = $tvElementsArray[$item];
  }
}

return implode($delimiter, $output);
После этого чтобы вывести на страницу ключи TV с множественным выбором через запятую взываем этот сниппет:
[[outputMultipleTV? &tvName=`mytv` &resourceId=`[[*id]]` &delimiter=`, `]]
В tvName нужно передать имя TV с множественным выбором, а в delimiter строку для отделения одного значения от другого.
Amsterdam
Amsterdam
Спасибо Александр, плагин работает! Но появилась мысль — а возможно ли сделать его вызов в качестве модификатора вывода? То есть, вместо вызова плагина делать вызов TV + модификатор, наподобие striptags, типа [[*tvname:outputMultipleTV]]
Александр Мальцев
Александр Мальцев
Да, можно сделать через модификатор вывода.
Содержимое сниппета outputMultipleTV в этом случае будет следующим:
<?php
$result = [];

$tv = $modx->getObject('modTemplateVar', array('name' => $name));

$delimiter = $tv->get('output_properties')['delimiter'];
$input = explode($delimiter, $input);

$tvElements = explode('||', $tv->get('elements'));
$tvElementsArray = [];
foreach ($tvElements as $tvElement){
  $item = explode('==', $tvElement);
  $tvElementsArray[$item[1]] = $item[0];
}

foreach ($input as $value){
  $result[] = $tvElementsArray[$value];
}

return implode($delimiter, $result);
Александр Мальцев
Александр Мальцев
Для этого дела также есть стандартный модификатор вывода tvLabel:
[[*tvname:tvLabel]]
Amsterdam
Amsterdam
Почему то не работает. Допускаю ошибку в выводе? Вывожу так [[*typeSpici:outputMultipleTV]], но значение на кириллице не выводится
Amsterdam
Amsterdam
вау! Вот это конечно здорово. Спасибо! Не знал о таком. Собственно вопрос с плагином в таком случае отпадает сам собой) Но все равно спасибо и за готовое решение!
Александр Мальцев
Александр Мальцев
Да, выводить его нужно так:
[[*typeSpici:outputMultipleTV]]
Если не работает, то можно попробовать очистить кэш.
vitaliy
vitaliy
Добрый день, Александр!

Спасибо за Ваши уроки, очень помогает.
Подскажите, пожалуйста, в верстке у меня предусмотрен спаун картинки «акция», как можно сделать что бы в TV полях была возможность включить или выключить такой вызов? Или возможно есть другой способ?
Чанк:
<div class="col-md-4 col-sm-6">   
    <div>
         <img src="[[+tv.block_photo]]" alt=""/>
     <!--------картинка акция  ------------->
            <div class="budget">
                <div class="budget-mask"><span>Акция</span></div>
            </div>
     <!--------/картинка акция  ------------>
    </div>
                    <div class="caption">
                        <p class="property-description">[[+tv.opisanie]]</p>
                        
                        <h3 class="property-title"><a href="[[+uri]]">[[+tv.price]]</a></h3>
                    </div>
</div>
В каком направлении хотя бы искать?
Спасибо!
Александр Мальцев
Александр Мальцев
Привет! TV поля привязаны к ресурсам. Если нужно для всего сайта, то тогда нужно использовать системные настройки, или лучше ClientConfig.
После установки пакета ClientConfg, перейдите в конфигурацию (Пакеты -> Конфигурация) и создайте группу, например, основные параметры. Затем, например, создайте ключ, is_promotion, имеющий тип поля «Чекбокс».
В чанке напишите конструкцию:
[[++is_promotion:is=`1`:then=`<!--------картинка акция  ------------->
  <div class="budget">
    <div class="budget-mask"><span>Акция</span></div>
  </div>
<!--------/картинка акция  ------------>`:else=``]]
В этом случае картинка «акция» будет выводиться пользователям только в том случае, если в конфигурации данное поле находится в отмеченном (включенном) состоянии.
vitaliy
vitaliy
Спасибо, так работает, но картинку добавляет ко всем позициям. А как сделать что бы к одной? У меня есть 6 товаров, и к одному из них я хочу добавить «акция», остальные оставить без изменений.

Я только учусь, не судите строго, пересмотрел уже кучу информации в Интернете но решения не нашел.
vitaliy
vitaliy
Например создаю TV c типом: «Флажки (checkbox)», в «Возможные значения» ставлю:
Акция==[[$sale]]
– ничего не происходит.
Или в самом чанке вызова товара пишу
[[+tv.sale:is=`1`:then=`[[$sale]]`:else=``]]
Тоже ничего.
Уже несколько дней не могу найти решение, по идее должно быть очень простое, подскажите, пожалуйста.
Александр Мальцев
Александр Мальцев
Так TV в шаблоне выводится с помощью такой записи:
[[*sale]]
Если TV имеет имя sale, то никаких префиксов указывать не нужно, оно выводится также как обычные поля ресурсов. В этом случае также не нужно использовать MODX фильтры.

Это будет работать так: Если галочка в дополнительном поле «Акция» установлена, то выведется содержимое чанка sale, если нет, то ничего не выведется.
vitaliy
vitaliy
Спасибо, за помощь.
Была ошибка с моей стороны, я использую pdoPage, и забыл добавить в &includeTVs новое TV.
Den
Den
Спасибо!
Я так понимаю, TV-параметры сильно нагружают систему?
Подскажите, пожалуйста, какие есть трюки для того, чтобы обойтись без TV-параметров вообще или сделать их выборку «быстрой».
Например, выбирать все TV одним запросом? Или другие варианты?
Александр Мальцев
Александр Мальцев
Пожалуйста!
TV-параметры — это удобный и простой механизм для добавления дополнительных полей к ресурсам. Если их использовать не слишком много, то они, конечно же, увеличат время генерации страницы, но это увеличение будет не существенным. Тут важнее правильно подойти к задаче и посмотреть, как её решить лучше. Также хорошая практика заключается в измерение времени написанных решений, а то узкое место может оказаться не там, где вы думаете.

Например, время запроса, в котором необходимо просто получить одно TV поле не составит более 0,001 секунды. Совсем другая ситуация, например, когда этих полей много и всех их, например, нужно использовать в запросе на странице поиска. Тут конечно время увеличится довольно сильно. Но и тут может разное придумать, всё зависит от проекта. Например, создать дополнительную таблицу и при сохранении ресурса или других действиях добавлять или обновлять строку в этой таблице. В этой таблице каждый ресурс и все его дополнительные поля будут храниться в одной записи. В этом случае поиск получится молниеносным.
Можно конечно и не использовать TV. Один из вариантов это использовать дополнительную таблицу. Пример этого решения приведён в этой статье.
Александр
Александр
Александр, подскажите пожалуйста, возможно ли как то ускорить фильтрацию mfilter2 по тв, есть ли какие варианты на подобие вышеперечисленных?
Александр Мальцев
Александр Мальцев
Значит необходимо по-другому организовать хранение данных. Например, без TV, или с использованием TV и какой-то дополнительной таблицы в базе данных, в которую будут сохраняться их значения, и затем использоваться в mFilter2 для поиска информации.
Александр
Александр
Без тв, не совсем понятно, тогда что использовать?
И по поводу дополнительной таблицы правильно я понимаю, создаю таблицу в базе данных, далее, где указать, куда сохранять и откуда брать данные для фильтрации?

Александр Мальцев
Александр Мальцев
Без TV имеется создать таблицу с полями и использовать её везде, а не только на странице поиска информации. Но, это потребует более глобальной работы, в результате, который производительность поднимется не только в mFilter2, но и всего сайта.

Второй вариант менее трудоёмкий, он заключается в том, чтобы оставить TV-поля, но создать дополнительную таблицу с данными которыми содержатся в TV-полях. При этом при сохранении TV-поля данные должны попадать в эту таблицу. Далее в mFilter2 использовать данные в этой таблице, а в не TV. В результате сильно уменьшиться время выполнения запроса и данные будут отдаваться намного быстрее.
Александр
Александр
Спасибо! Суть ясна.
Виталий
Виталий
Здравствуйте. мне нужно фильтровать прошедшие и будущие мероприятия.
Есть tv-поле data, в котором указываю дату начала мероприятия.
Теперь думаю, как сделать, что бы можно было показывать прошедшие мероприятия и будущие.
Для фильтрации использую nFilter2, по этому хорошо было бы фильтровать по TV-полю.
Вот как в это поле вывести условие:
&where=`{ "tv_date:>":"[[dataToday]]" }`
Так фильтр выводит прошедшие мероприятия.
сниппет dataToday — текущая дата.
А мне надо что бы была возможность переключать «прошедшие-будущие»
Дмитрий
Дмитрий
спасибо за статьи. Вообще хорошие материалы, правда, мне не хватает их систематизации в какой то логике, ну, это уже будет полноценный курс)

У меня вопрос — так как опыта ноль, создаю свой первый проект, сразу, то есть о чем читаю — то и делаю… В результате теряю много времени, так как приходится восполнять нередко обнаруживаемые «белые пятна» (а их много) и не всегда понимаю, какими инструментами решать ту или иную задачу. Подскажите, мне нужно спарсить данные с одного сайта — а именно базу данных нескольких сот объектов с описаниями, фотками и прочими делами. Парсер (программу) я вроде нашел, она выводит результаты в различном виде, в том числе в файле для mySQL, или в обычной EXEL. Вопрос — как мне залить это на сайт? Я не прошу полной инструкции, прошу посоветовать какими инструментами это делать, что надо первым делом изучить? нужно ли прямо сейчас начинать изучать СУБД mySQL, взаимодействие с БД через консоль, короче, все с нуля, или есть какие то уже готовые инструменты для этого? Это можно сделать в MODX или в phpMyadmin? в результате должен получиться каталог с функцией поиска по наборам параметров.
По одному заводить не варианта, сами понимаете. кроме того, предполагается, что пользователи с некоторыми правами могли бы создавать и редактировать эти объекты через фронтэнд, а так же прикреплять к себе существующие объекты, подтвердив свое право это сделать через некую авторизацию (скажем, подтвердив свои права через почту объекта). короче, какой путь быстрее?
Александр Мальцев
Александр Мальцев
Да, спасибо. Конечно хочется это выполнить, но пока это затруднительно.
Для получения контента со страниц сайта можно написать php скрипт с использованием cURL (клиентской библиотеки для работы с URL).
Дмитрий
Дмитрий
добрый вечер… немного наоборот) спарсить я нашел как… теперь вопрос — как залить это на мой сайт… в виде каталога… пока решил попробовать приспособить для этого минишоп2. попробую создать там каталог, а потом залить через phpMyAdmin спарсенные данные в соответствующую таблицу… пока только приблизительно понимаю, как это сделать, буду пробовать)
Александр Мальцев
Александр Мальцев
Добавлять данные в таблицы лучше с помощью xPDO.
yan
yan
Доброго времени суток. Вот такой вопрос возник. Создал TV с привязкой
@SELECT pagetitle,id FROM [[+PREFIX]]site_content WHERE template=4;
, вывожу в шаблоне вот так {$_modx->resource.autorTv} — следовательно выведен тайтл ресурса… а как вот сюда передать еще и id
<li><a href="айдиха привязанного ресурса"><i class="fa fa-user"></i> {$_modx->resource.autorTv}</a></li>
????

Александр Мальцев
Александр Мальцев
Можно сделать так:
<li>
    <a href="{$_modx->makeUrl($_modx->resource.autorTv)}"><i class="fa fa-user"></i>
        {$_modx->runSnippet('!pdoField', [
            'id' => $_modx->resource.autorTv,
            'field' => 'pagetitle'
        ])}
    </a>
</li>
yan
yan
Увы так не сработало, потянуло тайтл текущей страницы и ссылку вообще никак…
Александр Мальцев
Александр Мальцев
При таком SELECT он должен сохранять в базу id ресурса, а не pagetitle.
И, следовательно, конструкция
{$_modx->resource.autorTv}
должна выводить id, а не pagetitle.
Василий
Василий
Александр, доброго дня!
Я сочиняю сниппет, где использую значение tv «price». По логике мне нужно отличать положительное значение, пустое значение и «0». А в итоге и пустое и «0» — оба — «0».
Как я понял, при выводе TV преобразуется в string, и ничего сделать не получается. В настройках TV тип ввода — число, тип вывода — по умолчанию (тип «число» не предлагается).
Пробовал умножать вывод на 1 — тип к integer приводится, но и пусто и «0» становятся «0».
Можно с этим что-то сделать?
PS. При выводе TV через теги такого поведения не наблюдается, там "" и «0» отличаются.
Александр Мальцев
Александр Мальцев
Добрый день!
TV значения в базе данных хранятся в формате строки. Но это не мешает выполнить действия которые вы описали выше.
Пример сниппета:
<?php
$price = '';

// получаем id текущего ресурса
$id = $modx->resource->id;

// получаем значение TV price (12 - id TV)
$tv_price = $modx->getObject('modTemplateVarResource', array(
  'tmplvarid' => '12',
  'contentid' => $id
));

if ($tv_price) {
  $price = $tv_price->get('value');
  if (is_numeric($price)) {
    $price = (int) $price;
  }
}

if ($price==='') {
  $output = 'Цена равна пустой строке';
}

if (!is_numeric($price) && $price!=='') {
  $output = 'Цена не является числом';
}

if ($price===0) {
  $output = 'Цена равна нулю';
}

if ($price>0) {
  $output = 'Цена является положительным числом';
}

return $output;
Василий
Василий
Большое спасибо!
Еще не очень хорошо знаю PHP((
Буду учиться)
Вадим
Вадим
Александр Добрый день!

Помогите пожалуйста У меня такой снипет:
[[!pdoResources?
&parents=`25` 
&resources=`-26`
&limit=`1` 
&showHidden=`1` 
&hideContainers=`1` 
&sortby=`RAND()`
&includeTVs=`Картинка портфолио,Alt картинки портфолио,Вывод информационного обзацца на странице,Стоимость,Адресс,proekt` 
&tpl=`@INLINE 
<div class="col-md-6">
<div class="thumbnail" >
<p class="text-center lead" style="margin-bottom: 9px;"><span class="label label-info">[[+tv.Вывод информационного обзацца на странице]]</span></p>
<img class="img-responsive" alt="[[+tv.Alt картинки портфолио]]" src="[[+tv.Картинка портфолио]]" /> 
<div class="caption">
<div class="row">
<div class="col-md-6 col-xs-6"><p class="lead text-left">Стоимость</p></div>
<div class="col-md-6 col-xs-6"><p class="lead text-right">[[+tv.Стоимость]] руб.</p></div>
</div>
<p><span class="glyphicon glyphicon-home checked"></span>  [[+tv.Адресс]]</p>
<div class="row">
<div class="col-xs-6"><a href="[[+alias]].html" class="btn btn-primary btn-block"><i class="fa fa-search" aria-hidden="true"></i> Подробнее</a></div>
<div class="col-xs-6"><a href="#" class="btn btn-success btn-block" href="#" data-toggle="modal" data-target="#callback"><i class="fa fa-cogs" aria-hidden="true"></i> Хочу также</a></div></div>
</div>
</div>
</div>`
&where=`{"proekt:LIKE":"%Лево%"}`
]]
Через него выводятся фотки в разные колонки (право и лево), в зависимости что указанно в TV поле «proekt».
Мне нужно добавить еще одно поле «tipo», и сделать вывод разных фотографий на разных страницах моего сайта.

Вопрос как сделать что бы учитывались эти два поля одновременно?
Александр Мальцев
Александр Мальцев
Необходимо через запятую указать ещё одно условие:
&where=`{"условие1","условие2"}`
Вадим
Вадим
Спасибо получилось
Сергей
Сергей
Добрый день, у меня интернет магазин компьютеров и комплектующих на modx revo + minishop2 + tickets. У каждого продукта большое количество параметров. С помощью mfilter2 сделал фильтрацию параметров. По вашей статье сделал tv для шаблона жесткие диски, параметр «Назначение» -appointment.
Пытаюсь вывести с помощью
[[!mFilter2?
&parents=`[[*id]]`
&limit=`10`
&element=`msProducts`
&filters=`
ms|price:number,
ms|vendor:vendors,
tv|appointment
`
&_filterOptions=`{«autoLoad»:0}`
&class=`msProduct`
&sort=`ms|price:asc`
&tplOuter=`tpl.mFilter2.outer.2`
&tpls=`tpl.msProducts.row,tpl.msProducts.row2`
&tplFilter.outer.ms|price=`tpl.mFilter2.filter.slider`
&tplFilter.row.ms|price=`tpl.mFilter2.filter.number`
&tplFilter.outer.ms|vendor=`tpl.mFilter2.filter.select`
&tplFilter.row.ms|vendor=`tpl.mFilter2.filter.option`
&showLog=`1`
]]
Не выходит ничего, может я вообще что то не так делаю, раньше делал поля с помощью msfieldsmanager но получалось что в одном свойстве товара было до 100 параметров. Как лучше выполнить дополнительные поля товаров, чтоб у каждого товара они были уникальными, и могли настраиваться фильтром?
Александр Мальцев
Александр Мальцев
Попробуйте добавить в вызов сниппета параметр includeTVs:
&includeTVs=`appointment`
Сергей
Сергей
Если в разных контекстах языковые версии ресурсов связаны через Babel и tv-переменные заполнены только у главного контекста то как сделать выборку языковых версий ресурсов из других контекстов, а tv-переменные взять из основного контекста? Выборка с помощью pdoResources естественно.
Александр Мальцев
Александр Мальцев
Здесь придётся писать сниппет, т.к. с помощью pdoResources такую выборку не получится сделать. Вам придётся сначала получить для каждого ресурса в одном контексте, связанный с ним ресурс в другом контексте через TV параметр babelLanguageLinks. Данная TV переменная хранит данные в виде (например: web:64;en:65). Т.е. она показывает связь между ресурсами в разных контекстах. Далее вам необходимо будет эту строку разобрать и получить id ресурсов из другого контекста. И после этого переходить к получению необходимых TV полей.

Чтобы этого не делать, можно настроить синхронизацию необходимых TV переменных с помощью Babel. Для этого заходите на страницу «Системные настройки» -> Babel -> параметр babel.syncTvs. Нажимаете на кнопку «Редактировать» и в открывшемся диалоговом окне в качестве значения устанавливаете необходимые id TV для синхронизации. После этого значения указанных TV будут автоматически синхронизироваться у связанных ресурсов в разных контекстах.
Сергей
Сергей
Спасибо, я поэкспериментирую с настройками.
Может Вам приходилось работать с дополнением ms2Gallery, когда фото прикреплены к ресурсу? В случае с tv-переменными можно поступить так как вы написали выше, а вот как поступить если фотки были загружены при использовании дополнения ms2Gallery? Ну мне показалось, что использовать это дополнение для прикрепления фоток к ресурсам проще чем создавать tv-переменные. Хотя сайты у меня есть с использованием разных решений на счет фото.
Александр Мальцев
Александр Мальцев
Тут всё зависит от задачи. Если дополнение ms2Gallery позволит его решить, то почему бы его не использовать. Тем более что работать с ним просто, т.к. изображения привязываются к id ресурса. Для выборки изображений можно использовать условие msResourceFile.resource_id=modResource.id. Подробная документация, а также инструкции по выводу изображений с помощью pdoResources приведены на странице этого компонента в modstore.pro.