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

Александр Мальцев
Александр Мальцев
36K
55
Содержание:
  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`
]]

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

  1. Гарри
    Гарри
    25.11.2021, 18:15
    Добрый день!

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

      MODX Revolution 2.8.1-pl
      1. Алексей
        Алексей
        27.12.2020, 17:14
        Добрый день, Александр. Почитал вашу статью и возник такой вот вопрос, а для меня помощь как начинающему. У меня есть архив новостей(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();
        }
        }
        Подскажите как сделать лучше?
        1. Алексей
          Алексей
          27.12.2020, 17:41
          [[!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
        2. Антон
          Антон
          22.09.2020, 21:30
          Друзья, я новичок в 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
          Заранее спасибо!
          1. Антон
            Антон
            22.09.2020, 22:18
            Проблема решилась очень просто.

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

                Поясню:

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

                Спасибо.
                1. Александр Мальцев
                  Александр Мальцев
                  26.09.2020, 14:42
                  Вроде таких настроек нет. Тут нужно копаться в исходных файлах и смотреть как это реализовано, и можно ли это изменить по-другому. С такой задачей не сталкивался, поэтому не подскажу. Если нет желание разбираться, то можно просто написать свою фильтрацию так как нужно.
          2. Виталий
            Виталий
            24.08.2020, 04:25
            помогите правильно написать условие &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- полю.

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

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

                При обычном выводе во фронт отдаются латинские значения
                1. Александр Мальцев
                  Александр Мальцев
                  03.04.2020, 06:27
                  Для этого дела также есть стандартный модификатор вывода tvLabel:
                  [[*tvname:tvLabel]]
                  
                  1. Amsterdam
                    Amsterdam
                    03.04.2020, 11:25
                    вау! Вот это конечно здорово. Спасибо! Не знал о таком. Собственно вопрос с плагином в таком случае отпадает сам собой) Но все равно спасибо и за готовое решение!
                  2. Александр Мальцев
                    Александр Мальцев
                    02.04.2020, 11:57
                    Добрый день!
                    В этой записи ключ располагается до «==», а значение после. При выводе значения 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 строку для отделения одного значения от другого.
                    1. Amsterdam
                      Amsterdam
                      02.04.2020, 12:59
                      Спасибо Александр, плагин работает! Но появилась мысль — а возможно ли сделать его вызов в качестве модификатора вывода? То есть, вместо вызова плагина делать вызов TV + модификатор, наподобие striptags, типа [[*tvname:outputMultipleTV]]
                      1. Александр Мальцев
                        Александр Мальцев
                        02.04.2020, 14:38
                        Да, можно сделать через модификатор вывода.
                        Содержимое сниппета 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);
                        
                        1. Amsterdam
                          Amsterdam
                          03.04.2020, 11:22
                          Почему то не работает. Допускаю ошибку в выводе? Вывожу так [[*typeSpici:outputMultipleTV]], но значение на кириллице не выводится
                          1. Александр Мальцев
                            Александр Мальцев
                            03.04.2020, 14:45
                            Да, выводить его нужно так:
                            [[*typeSpici:outputMultipleTV]]
                            Если не работает, то можно попробовать очистить кэш.
                  3. vitaliy
                    vitaliy
                    06.12.2019, 15:05
                    Добрый день, Александр!

                    Спасибо за Ваши уроки, очень помогает.
                    Подскажите, пожалуйста, в верстке у меня предусмотрен спаун картинки «акция», как можно сделать что бы в 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>
                    
                    В каком направлении хотя бы искать?
                    Спасибо!
                    1. Александр Мальцев
                      Александр Мальцев
                      07.12.2019, 14:58
                      Привет! TV поля привязаны к ресурсам. Если нужно для всего сайта, то тогда нужно использовать системные настройки, или лучше ClientConfig.
                      После установки пакета ClientConfg, перейдите в конфигурацию (Пакеты -> Конфигурация) и создайте группу, например, основные параметры. Затем, например, создайте ключ, is_promotion, имеющий тип поля «Чекбокс».
                      В чанке напишите конструкцию:
                      [[++is_promotion:is=`1`:then=`<!--------картинка акция  ------------->
                        <div class="budget">
                          <div class="budget-mask"><span>Акция</span></div>
                        </div>
                      <!--------/картинка акция  ------------>`:else=``]]
                      В этом случае картинка «акция» будет выводиться пользователям только в том случае, если в конфигурации данное поле находится в отмеченном (включенном) состоянии.
                      1. vitaliy
                        vitaliy
                        09.12.2019, 12:00
                        Спасибо, так работает, но картинку добавляет ко всем позициям. А как сделать что бы к одной? У меня есть 6 товаров, и к одному из них я хочу добавить «акция», остальные оставить без изменений.

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

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

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

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

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

                          У меня вопрос — так как опыта ноль, создаю свой первый проект, сразу, то есть о чем читаю — то и делаю… В результате теряю много времени, так как приходится восполнять нередко обнаруживаемые «белые пятна» (а их много) и не всегда понимаю, какими инструментами решать ту или иную задачу. Подскажите, мне нужно спарсить данные с одного сайта — а именно базу данных нескольких сот объектов с описаниями, фотками и прочими делами. Парсер (программу) я вроде нашел, она выводит результаты в различном виде, в том числе в файле для mySQL, или в обычной EXEL. Вопрос — как мне залить это на сайт? Я не прошу полной инструкции, прошу посоветовать какими инструментами это делать, что надо первым делом изучить? нужно ли прямо сейчас начинать изучать СУБД mySQL, взаимодействие с БД через консоль, короче, все с нуля, или есть какие то уже готовые инструменты для этого? Это можно сделать в MODX или в phpMyadmin? в результате должен получиться каталог с функцией поиска по наборам параметров.
                          По одному заводить не варианта, сами понимаете. кроме того, предполагается, что пользователи с некоторыми правами могли бы создавать и редактировать эти объекты через фронтэнд, а так же прикреплять к себе существующие объекты, подтвердив свое право это сделать через некую авторизацию (скажем, подтвердив свои права через почту объекта). короче, какой путь быстрее?
                          1. Александр Мальцев
                            Александр Мальцев
                            10.08.2018, 18:07
                            Да, спасибо. Конечно хочется это выполнить, но пока это затруднительно.
                            Для получения контента со страниц сайта можно написать php скрипт с использованием cURL (клиентской библиотеки для работы с URL).
                            1. Дмитрий
                              Дмитрий
                              11.08.2018, 01:11
                              добрый вечер… немного наоборот) спарсить я нашел как… теперь вопрос — как залить это на мой сайт… в виде каталога… пока решил попробовать приспособить для этого минишоп2. попробую создать там каталог, а потом залить через phpMyAdmin спарсенные данные в соответствующую таблицу… пока только приблизительно понимаю, как это сделать, буду пробовать)
                              1. Александр Мальцев
                                Александр Мальцев
                                12.08.2018, 04:26
                                Добавлять данные в таблицы лучше с помощью xPDO.
                          2. yan
                            yan
                            09.10.2017, 17:21
                            Доброго времени суток. Вот такой вопрос возник. Создал 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>
                            ????

                            1. Александр Мальцев
                              Александр Мальцев
                              10.10.2017, 13:52
                              Можно сделать так:
                              <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>
                              
                              1. yan
                                yan
                                10.10.2017, 14:52
                                Увы так не сработало, потянуло тайтл текущей страницы и ссылку вообще никак…
                                1. Александр Мальцев
                                  Александр Мальцев
                                  18.10.2017, 16:13
                                  При таком SELECT он должен сохранять в базу id ресурса, а не pagetitle.
                                  И, следовательно, конструкция
                                  {$_modx->resource.autorTv}
                                  должна выводить id, а не pagetitle.
                            2. Василий
                              Василий
                              12.09.2017, 16:10
                              Александр, доброго дня!
                              Я сочиняю сниппет, где использую значение tv «price». По логике мне нужно отличать положительное значение, пустое значение и «0». А в итоге и пустое и «0» — оба — «0».
                              Как я понял, при выводе TV преобразуется в string, и ничего сделать не получается. В настройках TV тип ввода — число, тип вывода — по умолчанию (тип «число» не предлагается).
                              Пробовал умножать вывод на 1 — тип к integer приводится, но и пусто и «0» становятся «0».
                              Можно с этим что-то сделать?
                              PS. При выводе TV через теги такого поведения не наблюдается, там "" и «0» отличаются.
                              1. Александр Мальцев
                                Александр Мальцев
                                13.09.2017, 15:46
                                Добрый день!
                                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;
                                
                                1. Василий
                                  Василий
                                  14.09.2017, 11:39
                                  Большое спасибо!
                                  Еще не очень хорошо знаю PHP((
                                  Буду учиться)
                              2. Вадим
                                Вадим
                                18.07.2017, 13:50
                                Александр Добрый день!

                                Помогите пожалуйста У меня такой снипет:
                                [[!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», и сделать вывод разных фотографий на разных страницах моего сайта.

                                Вопрос как сделать что бы учитывались эти два поля одновременно?
                                1. Александр Мальцев
                                  Александр Мальцев
                                  18.07.2017, 14:19
                                  Необходимо через запятую указать ещё одно условие:
                                  &where=`{"условие1","условие2"}`
                                  1. Вадим
                                    Вадим
                                    18.07.2017, 19:11
                                    Спасибо получилось
                                2. Сергей
                                  Сергей
                                  15.12.2016, 11:52
                                  Добрый день, у меня интернет магазин компьютеров и комплектующих на 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 параметров. Как лучше выполнить дополнительные поля товаров, чтоб у каждого товара они были уникальными, и могли настраиваться фильтром?
                                  1. Александр Мальцев
                                    Александр Мальцев
                                    16.12.2016, 11:10
                                    Попробуйте добавить в вызов сниппета параметр includeTVs:
                                    &includeTVs=`appointment`
                                    
                                  2. Сергей
                                    Сергей
                                    06.12.2016, 13:58
                                    Если в разных контекстах языковые версии ресурсов связаны через Babel и tv-переменные заполнены только у главного контекста то как сделать выборку языковых версий ресурсов из других контекстов, а tv-переменные взять из основного контекста? Выборка с помощью pdoResources естественно.
                                    1. Александр Мальцев
                                      Александр Мальцев
                                      07.12.2016, 15:02
                                      Здесь придётся писать сниппет, т.к. с помощью pdoResources такую выборку не получится сделать. Вам придётся сначала получить для каждого ресурса в одном контексте, связанный с ним ресурс в другом контексте через TV параметр babelLanguageLinks. Данная TV переменная хранит данные в виде (например: web:64;en:65). Т.е. она показывает связь между ресурсами в разных контекстах. Далее вам необходимо будет эту строку разобрать и получить id ресурсов из другого контекста. И после этого переходить к получению необходимых TV полей.

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