MODX - TV параметры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Расположение TV переменных у ресурса, представление которого было настроено с помощью инструмента "Настройка форм"
Расположение 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-полей
Вывод всех дочерних ресурсов (по отношению к текущему) вместе со значениями их 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. Анна
    2 минуты назад
    Уже настроено нужное дополнительное поле TV, но в одном шаблоне нужно дважды его использовать? Это возможно или необходимо делать такое же еще раз и уже его добавлять?
    и второй вопрос — как менять расположение блоков на странице? в шаблоне или на странице категории? не нахожу нигде prnt.sc/13o0n52

    MODX Revolution 2.8.1-pl
    1. Алексей
      27 декабря 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 декабря 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 сентября 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.infopej2.beget.tech/wika/

        Заранее спасибо!
        1. Антон
          22 сентября 2020, 22:18
          Проблема решилась очень просто.

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

              Поясню:

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

              Спасибо.
              1. Александр Мальцев
                26 сентября 2020, 14:42
                Вроде таких настроек нет. Тут нужно копаться в исходных файлах и смотреть как это реализовано, и можно ли это изменить по-другому. С такой задачей не сталкивался, поэтому не подскажу. Если нет желание разбираться, то можно просто написать свою фильтрацию так как нужно.
        2. Виталий
          24 августа 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 августа 2020, 12:53
            Соединить условия в &where можно так:
            [[!pdoPage?
              ...
              &where=`["parent = [[*id]] AND category = [[*id]]"]`
            ]]
            1. Виталий
              24 августа 2020, 13:05
              &where=`["parent = [[*id]] OR category = [[*id]]"]`
              это работает
              1. Александр Мальцев
                24 августа 2020, 13:56
                Смотря что нужно. Если необходимо вывести ресурсы, у которых parent равно [[*id]] или category равно [[*id]], то так.
              2. Виталий
                24 августа 2020, 13:00
                &where=`["parent = [[*id]] AND category = [[*id]]"]`
                так ничего не показывает…
            2. Amsterdam
              24 марта 2020, 14:16
              Добрый день Александр!

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

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

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

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

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

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

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

                        У меня вопрос — так как опыта ноль, создаю свой первый проект, сразу, то есть о чем читаю — то и делаю… В результате теряю много времени, так как приходится восполнять нередко обнаруживаемые «белые пятна» (а их много) и не всегда понимаю, какими инструментами решать ту или иную задачу. Подскажите, мне нужно спарсить данные с одного сайта — а именно базу данных нескольких сот объектов с описаниями, фотками и прочими делами. Парсер (программу) я вроде нашел, она выводит результаты в различном виде, в том числе в файле для mySQL, или в обычной EXEL. Вопрос — как мне залить это на сайт? Я не прошу полной инструкции, прошу посоветовать какими инструментами это делать, что надо первым делом изучить? нужно ли прямо сейчас начинать изучать СУБД mySQL, взаимодействие с БД через консоль, короче, все с нуля, или есть какие то уже готовые инструменты для этого? Это можно сделать в MODX или в phpMyadmin? в результате должен получиться каталог с функцией поиска по наборам параметров.
                        По одному заводить не варианта, сами понимаете. кроме того, предполагается, что пользователи с некоторыми правами могли бы создавать и редактировать эти объекты через фронтэнд, а так же прикреплять к себе существующие объекты, подтвердив свое право это сделать через некую авторизацию (скажем, подтвердив свои права через почту объекта). короче, какой путь быстрее?
                        1. Александр Мальцев
                          10 августа 2018, 18:07
                          Да, спасибо. Конечно хочется это выполнить, но пока это затруднительно.
                          Для получения контента со страниц сайта можно написать php скрипт с использованием cURL (клиентской библиотеки для работы с URL).
                          1. Дмитрий
                            11 августа 2018, 01:11
                            добрый вечер… немного наоборот) спарсить я нашел как… теперь вопрос — как залить это на мой сайт… в виде каталога… пока решил попробовать приспособить для этого минишоп2. попробую создать там каталог, а потом залить через phpMyAdmin спарсенные данные в соответствующую таблицу… пока только приблизительно понимаю, как это сделать, буду пробовать)
                            1. Александр Мальцев
                              12 августа 2018, 04:26
                              Добавлять данные в таблицы лучше с помощью xPDO.
                        2. yan
                          09 октября 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 октября 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
                              10 октября 2017, 14:52
                              Увы так не сработало, потянуло тайтл текущей страницы и ссылку вообще никак…
                              1. Александр Мальцев
                                18 октября 2017, 16:13
                                При таком SELECT он должен сохранять в базу id ресурса, а не pagetitle.
                                И, следовательно, конструкция
                                {$_modx->resource.autorTv}
                                должна выводить id, а не pagetitle.
                          2. Василий
                            12 сентября 2017, 16:10
                            Александр, доброго дня!
                            Я сочиняю сниппет, где использую значение tv «price». По логике мне нужно отличать положительное значение, пустое значение и «0». А в итоге и пустое и «0» — оба — «0».
                            Как я понял, при выводе TV преобразуется в string, и ничего сделать не получается. В настройках TV тип ввода — число, тип вывода — по умолчанию (тип «число» не предлагается).
                            Пробовал умножать вывод на 1 — тип к integer приводится, но и пусто и «0» становятся «0».
                            Можно с этим что-то сделать?
                            PS. При выводе TV через теги такого поведения не наблюдается, там "" и «0» отличаются.
                            1. Александр Мальцев
                              13 сентября 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 сентября 2017, 11:39
                                Большое спасибо!
                                Еще не очень хорошо знаю PHP((
                                Буду учиться)
                            2. Вадим
                              18 июля 2017, 13:50
                              Александр Добрый день!

                              Помогите пожалуйста У меня такой снипет:

                              [[!pdoResources?
                              &parents=`25`
                              &resources=`-26`
                              &limit=`1`
                              &showHidden=`1`
                              &hideContainers=`1`
                              &sortby=`RAND()`
                              &includeTVs=`Картинка портфолио,Alt картинки портфолио, Вывод информационного обзацца на странице, Стоимость, Адресс,proekt`
                              &tpl=`@INLINE
                              [[+tv.Вывод информационного обзацца на странице]]
                              [[+tv.Alt картинки портфолио]]
                              Стоимость
                              [[+tv.Стоимость]] руб.

                              &nbsp [[+tv.Адресс]]
                              Подробнее
                              Хочу также


                              `
                              &where=`{«proekt:LIKE»:"%Лево%"}`
                              ]]

                              Через него выводятся фотки в разные колонки (право и лево), в зависимости что указанно в TV поле «proekt».
                              Мне нужно добавить еще одно поле «tipo», и сделать вывод разных фотографий на разных страницах моего сайта.

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

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