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

Александр Мальцев
32K
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. Алексей
    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.
                                Войдите, пожайлуста, в аккаунт, чтобы оставить комментарий.