Skip to content
  1. Компоненты
  2. msExtraFields
  3. Сниппеты

Cниппеты

parseMeasure

Используется для вывода "типа измерения". Которое должно совпадает с именем ключа массива хранящегося в системной настройке ms2efs_product_custom_measure.

Параметры

НазваниеОписание
&prefixТекст который будет стоять перед именем типа.
&postfixТекст который будет добавлен после имени типа
&inputИмя ключа массива

Пример вызова:

modx
[[!parseMeasure?
  &input=`kg`
  &prefix=`в`
  &postfix=`см на метр кубический`
]]

В виде модификатора на странице товара:

modx
[[!+measure:parseMeasure=`prefix=" / "`]]

msExtraFields

Выводит список свойств внутри товара, в корзине, и используется для вывода свойств в качестве фильтров при вызове сниппета mFilter2. Для работы сниппета требуется pdoTools. Так как он используется в различных целях то и набор передаваемых параметров в каждом случае различный. При этом, во всех случаях вы можете использовать дополнительно параметры сниппета pdoTools. Внутри параметров можно использовать плейсхолдеры, которые являются этими же праметрами.

Общие параметры

НазваниеПо умолчаниюОписание
&log_targetECHOFILE - вывод лога в файл; HTML - вывод на экран с оформлением в html + css; ECHO, AUTO, SYSTEM - вывод без оформления; PLACEHOLDER - вывод в плейсхолдер;
&showLogfalseвывод лога компонентом pdoFetch, при true данные попадают в мой log
&log_statusfalseвключает вывод лога компонента msExtraFields, если опция &showLog также включена, то вывод ее лога попадает под действие метода ведения лога текущего компонента
&log_filenamefalseимя файла в который будет отправлен лог, строится в виде конкатенации имени и даты в формате "_Y-m-d__H-i-s". Путь к файлу: MODX_CORE_PATH."cache/logs/".
&log_placeholderlog_msExtraFieldsимя плейсхолдера в который будет передан лог. При ajax ответе значение параметра используется в качестве имени класс объекта, в который будет размещен лог пришедший от сервера. Более подробно смотрите в примерах управления ценой товаров.
&log_detailfalseзаписывает доп. информацию о системе в лог
&log_targetECHOFILE - вывод лога в файл; HTML - вывод на экран с оформлением в html + css; ECHO, AUTO, SYSTEM - вывод без оформления; PLACEHOLDER - вывод в плейсхолдер;
&log_isstyledtrueпри &log_target == (HTML или PLACEHOLDER) все строки лога в зависимости от их уровня (INFO, WARN, ERROR) оборачиваются в html теги с применением стилей CSS. Тем самым делая вывод более удобным для восприятия.
&log_selfmsgtrueзаписывает в лог только свои сообщения посланные только из текущего компонента
&log_levelINFOуровень выводимых сообщений, установлен по умолчанию в конфиге modx, можно передать: INFO, WARN, ERROR, FATAL, DEBUG, либо соответствующее цифровое значение.
&cacheTime1800время жизни кеша в секундах (используется также в pdoTools). При выводе товара в режиме редактирования данная настройка используется в ajax запросах, более подробно смотрите в примерах управления ценой товаров.
&cacheUidуникальный идентификатор, формируется при открытии товара в режиме редактирования, служит для сохранения и повторного использования параметров сниппета при ajax зпросах. Генерируется автоматически, но по необходимости можно прописать значение вручную. Неразрывно связан с параметром cacheTime.
&pluginsms2_core_path . 'plugins/'путь к minishop2 с добавлением 'plugins/'.
&plugins_processorsms2_core_path . 'processors/mgr/msextrafields/'путь к файлам процессора.
&tplPath[[+plugins]]msextrafields/chunksпуть к файлам чанков. [[+plugins]] - это значение текущего параметра &plugins.
&typeOfDataoptionsoptions - возвращает свойства товара; getFilters - возвращает свойства внутри фильтра получаемого сниппетом mFilter2; cart - возвращает свойства товара в корзине;

Вывод свойств товаров

Параметры товаров

НазваниеПо умолчаниюОписание
&displayeditedit, info, short - способ отображения данных, в зависимости от которого имя параметра вызывающего чанк соответвующего свойства формируются следующим образом: "tplProduct_" + "тип свойства" + "_" + "значение параметра display" + "_" + "row или wrap". В соответствии с этим правилом для каждого свойства вызывается соответствующий чанк. edit - отрабатывает чанки свойств, в имени параметра которых нет суфикса (info или short), например tplProduct_checkbox_row. Эти чанки позволяют пользователю менять значения свойств, тем самым влияя на уточнение характеристик товара перед его заказом; info - информативный шаблон (например: tplProduct_checkbox_info_row); short - только информативный (например: tplProduct_checkbox_short_row), срабатывает если значение поля inshort == 1;
&productIdnullid документа c классом msProduct или msCategory из которого берутся свойства товара или категории, если не указан,то за основу берется текущий документ
&fastGeneratefalseпри true берет ранее сформированные данные из таблицы ms2_product, поля msextrafields, если страница закеширована или сниппет вызвается закешированным или были произведены изменения в товаре, но сам документ не был сохранен, есть вероятность что данные будут не актуальны!
&fastModefalseбыстрый режим обработки чанков. Все необработанные теги (условия, сниппеты и т.п.) будут вырезаны (см. pdoTools).
&showUnpublishedfalseпри true, выводит все документы включая не опубликованные, иначе только опубликованные
&showDeletedfalseпри true, выводит все документы вместе с теми что помечены на удаление
&showHiddenfalseпри true, выводит только также документы у которых установлен параметр "Не показывать в меню"

Пример

Вызов внутри группы товаров для получения общего списка с их характеристиками, будут возвращены только те свойства у которых установлен параметр inshort.

modx
[[!msExtraFields?
  &display=`short`
  &productId=`[[+id]]`
  &tpl_group=``
]]

Пример

Тот же вызов внутри товара.

modx
[[!msExtraFields?
  &display=`short`
]]

Пример

Вызов внутри товара c типом отображения info.

modx
[[!msExtraFields?
  &display=`info`
]]

Пример

Вызов внутри товара c типом отображения edit.

modx
[[!msExtraFields?
  &display=`edit`
]]

Пример

Чанки

НазваниеПо умолчаниюОписание
tpl_group@FILE: products/group.tplЧанк построения группы свойств. Принимает [[+group_name]] и [[+output]].
tplOrder_discounts_row@FILE: order/discounts_row.tplЧанк информации о возможных скидках, принимает [[+tip]].
tplOrder_discounts_wrap@FILE: order/discounts_wrap.tplЧанк обертки информации о скидках, принимает [[+output]].
tplProduct_checkbox_info_row@FILE: products/checkbox_info_row.tplЧанк чекбокса, строящегося при display==info.
tplProduct_checkbox_row@FILE: products/checkbox_row.tplЧанк чекбокса, строящегося при display==edit.
tplProduct_checkbox_short_row@FILE: products/checkbox_short_row.tplЧанк чекбокса, строящегося при display==short.
tplProduct_checkbox_wrap@FILE: products/checkbox_wrap.tplЧанк обертки элемента чекбокс.
tplProduct_default_row@FILE: products/default_row.tplЧанк строки свойства по умолчанию, вызывается если ни один из типов чанков для текущего параметра display не был задан.
tplProduct_default_wrap@FILE: products/default_wrap.tplЧанк обертки по умолчанию.
tplProduct_default_short_row@FILE: products/default_short_row.tplЧанк строки свойства по умолчанию, вызывается если ни один из типов чанков для параметра display==short не был задан.
tplProduct_default_short_wrap@FILE: products/default_short_wrap.tplЧанк обертки по умолчанию для типа отображения short.
tplProduct_listbox_info_row@FILE: products/listbox_info_row.tplЧанк строки одинарного списка, строящегося при display==info.
tplProduct_listbox_info_wrap@FILE: products/listbox_info_wrap.tplЧанк обертки. Данный чанк срабатывает в случае если у нас только одно свойство и если оно не изменяет цену.
tplProduct_listbox_row@FILE: products/listbox_row.tplЧанк строки одинарного списка, строящегося при display==edit.
tplProduct_listbox_wrap@FILE: products/listbox_wrap.tplЧанк обертки строки одинарного списка, позволяет оставлять значение не выбранным.
tplProduct_listboxes_info_row@FILE: products/listboxes_info_row.tplЧанк строки списка с возможностью множественного выбора, строящегося при display==info.
tplProduct_listboxes_info_wrap@FILE: products/listboxes_info_wrap.tplЧанк обертки списка с возможностью множественного выбора.
tplProduct_listboxes_row@FILE: products/listboxes_row.tplЧанк строки списка с возможностью множественного выбора, строящегося при display==edit.
tplProduct_listboxes_wrap@FILE: products/listboxes_wrap.tplЧанк обертки строки списка с возможностью множественного выбора, строящегося при display==edit.
tplProduct_option_row@FILE: products/option_row.tplЧанк строки одиночного списка, строящегося при display==edit.
tplProduct_option_wrap@FILE: products/option_wrap.tplЧанк обертки строки одиночного списка, строящегося при display==edit, требует обязательного ввода одного значения.
tplProduct_range_row@FILE: products/range_row.tplЧанк свойства с типом диапазон, строящегося при display==edit.
tplProduct_range_wrap@FILE: products/range_wrap.tplЧанк обертки свойства с типом диапазон, строящегося при display==edit.

В чанки с префиксом tplProduct_ и постфиксом _row (например: tplProduct_checkbox_info_row), текущий элемент (значение) свойства, передаются следующие плейсхолдеры:

ПлейсхолдерОписание
[[+idx]]последовательный идентификтор значения свойства
[[+id]]id записи свойства в текущем документе
[[+res_id]]id текущего ресурса
[[+prop_id]]id свойства в настроках miniShop2
[[+count]]кол-во товара на складе
[[+article]]артикул товара
[[+cond]]условие по которому проверяется значение
[[+value]]текущее значение свойства
[[+price]]цена текущего свойства
[[+tip]]подсказка к свойству
[[+disabled]]выключено (0 или 1)
[[+createdby]]имя учетной записи пользователя создавшего запись
[[+updatedby]]имя учетной записи пользователя обновившего запись
[[+createdon]]дата создания записи в формате: YYYY-MM-DD HH:MM:SS
[[+updatedon]]дата обновления записи в формате: YYYY-MM-DD HH:MM:SS
[[+group]]имя группы
[[+prop_name]]имя свойства
[[+measure]]ключ типа измерения, по умолчанию 0
[[+measure_name]]распарсенное значение поля "тип измерения"
[[+type]]тип свойства (text, listbox ...)
[[+defaultval]]значение по умолчанию
[[+inshort]]разрешено ли отображать в типе SHORT, выводит 0 или 1
[[+onlyinfo]]вывод только в типе INFO, выводит 0 или 1
[[+active]]активна ли запись, значение устанавливается в общих настройках или в настройках категории, выводит 0 или 1
[[+prop_description]]описание текущего свойства, устанавливается в общих настройках.
[[+cat_property_id]]id ближайшего ресурса категории в котором объявлено текущее свойство
[[+cat_property_pagetitle]]pagetitle ближайшего ресурса категории в котором объявлено текущее свойство
[[+chunkname]]значение поле чанк в формате JSON полученное от ближайшего родителя, которые его содержит, или из общих настроек
[[+chunkname_prop]]значение поле чанк в формате JSON полученное от ближайшего родителя, которые его содержит
[[+order_discount]]массив скидок для текущего свойства

В чанки с префиксом tplProduct_ и постфиксом _wrap (например: tplProduct_checkbox_wrap), обертка свойства, передаются следующие плейсхолдеры:

ПлейсхолдерОписание
[[+idx]]последовательный идентификтор свойства
[[+group_name]]имя группы
[[+prop_name]]имя свойства
[[+prop_name]]id свойства в настроках miniShop2
[[+type]]тип свойства (text, listbox ...)
[[+output]]скомбинированные значения свойств - последовательная конкатенция результатов парсинга чанков текущего свойства с постфиксом "_row"

Кастомизация чанков

По умолчанию используются чанки которые лежат в core/components/minishop2/plugins/msextrafields/chunks/. Все они разделены на типы отображения см. &display. Вы можете изменить внешний вид любого из них, но лучше воспользоваться опцией позволяющей создать для любого свойства собственную группу оформления.

Для этого в общих настройках свойств, или в категориях (если вы не хотите прописывать внешнее оформление глобально для всех категорий товаров), можно воспользоваться полем Чанк. Оно принимает сформированный JSON в соответствии с которым у клиента будет отображаться текущее свойство. Для примера разберем следующую запись:

json
{
  "row": {
    "edit":"@FILE: products/pics_row.tpl",
    "short":"@FILE: products/pics_short_row.tpl",
    "info":"@FILE: products/pics_info_row.tpl"
  },
  "wrap": {
    "edit":"@FILE: products/pics_wrap.tpl"
  }
}

Такая конструкция переписывает настройки заданные по умолчанию, т.е. если вам необходимо изменить только тип отображения info у значения свойства, то достаточно прописать {"row":{"info":"@FILE: products/pics_info_row.tpl"}}.

Вывод свойств товара внутри корзины

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

modx
[[!msExtraFields?
  &typeOfData=`cart`
  &productId=`[[+id]]`
  &display=`info`
  &tpl_group=`@INLINE:[[+output]]`
]]

Вывод свойств товара внутри корзины

Интеграция с mSearch2 (в качестве фильтра сниппета mFilter2)

Использование динамических свойств позволяет внедрять их в качестве фильтра сниппета mFilter2. А с применением css отличить визульно их от стандартных свойств становиться практически не возможно. Критерии фильтрации также пописываются в адресную строку в качестве параметра &filters, и при открытии ссылки с критериями, пользователь сразу получает отфильтрованную информацию сформированную на сервере, затем JS (указанный в системной настройке ms2efs_frontend_js) на основе этих критериев правит внешний вид фильтров (тем самым давая понять какие свойства были установлены) и заполняет блок "Вы выбрали".

Этот же файл путем перегрузки стандартного механизма, управляющего поведением фильтра, перехватывает все управление фильтрами, и если пользователь нажимает на фильтр не относящий к компоненту msExtraFields, то управление передается стандартным методам описаным в JS компонента mFilter2.

Внешний вид каждого свойства соответствует тому, что мы видим при запуске msExtraFields в режиме редактирования (edit), но согласитесь, было бы не правильно выводить в фильтре значения списков оформленных как radio button, тем самым ограничивая возможности пользователя в поиске данных, только одним значением за один раз.

Поэтому была внедрена специальная возможность, которая позволяет перед построением фильтра на лету менять тип этих свойств на множественный выбор. Она регулируется с помощью системной настройки ms2efs_autotype.

Интеграция

Внедряются фильтры весьма просто, достаточно прописать их в параметры "filters" и создать соответствующие чанки. Результаты фильтрации, включая пагинацию в качестве одного из условий, сохраняются в кеш, в соответствии с параметром времени его существования cacheTime. Если у вас не выводятся фильтры проверьте наличие значения "msExtraFieldsFilter", параметра обработчика mse2_filters_handler_class, в настройках компонента "msearch2".

modx
[[!mFilter2?
  // добавим кастомный фильтр, он будет вызываться из файла
  // core/components/msearch2/custom/filters/msextrafields.class.php
  &filters=`msextrafields|all:msextrafields`

  // чтобы было удобнее пропишем псевдоним фильтра, именно он будет у нас в адресной
  // строке в качестве параметра фильтра
  &aliases=`msextrafields|all==filters_name`

  // пропишем чанки, постфикс имени чанка должен совпадать со значением псевдонима
  // чанк строки можно не прописывать, он не используется при построении
  &tplFilter.row.filters_name=`@INLINE: [[+title]]`

  // чанк обертки вызывает сниппет построения фильтров
  &tplFilter.outer.filters_name=`@FILE:categories/chunks/mFilter2_ms2efs_all_outer.tpl`

  // чанк строки результатов поиска, возвращает краткие свойства товара
  &tpl=`@FILE:categories/chunks/msProducts_row.tpl`

  // можно передать доп параметры в msExtraFields, например для вывода лога,
  // для этого нужно перед именем параметра указать префикс "ms2efs_"
  &ms2efs_log_status=`1`
  &ms2efs_log_target=`FILE`
  &ms2efs_log_filename=`mse2_get_msProduct`
]]

Рассмотрим чанк строки результата поиска "msProducts_row.tpl". Для того чтобы правильно заполнялось поле цены, нужно обернуть ее в класс "e-price", сами фильтры нужно обернуть в класс "short-options".

modx
[[+price:ne=`0`:then=`
  <div class="e-price">
    [[+price]]
    <span class="measure">
      [[%ms2_frontend_currency]] [[!+custom_measure:parseMeasure=`prefix="/ "`]]
    </span>
    [[+old_price]]
  </div>
`]]

<div class="short-options">
  [[!msExtraFields?
    &display=`short`
    &productId=`[[+id]]`
  ]]
</div>

Чанк обертки mFilter2_ms2efs_all_outer.tpl вызывает сниппет построения фильтров, обязательное условие это обернуть все в класс ms2efs_options. Обратите внимание на параметр typeOfData - он отвечает за построение фильтров в нужном виде.

modx
<div id="[[+table]]" class="ms2efs_options" data-filterkey="[[+filter_key]]">
  [[!msExtraFields?
    &typeOfData=`getFilters`
    &filter=`[[+filter]]`
    &table=`[[+table]]`
  ]]
</div>

Borders (границы...)

Так как система обладает наследованием и подразумевает возможность существования вложенных категорий, возникает вопрос об использовании свойств объявленных в таких документах в качестве элементов фильтрации данных. А именно перед нами встают несколько задач:

Для реализации этих задач служат несколько параметров.

НазваниеПо умолчаниюОписание
&resourceId[[+id]]идентификтор текущего документа класса "категория товара". Если вы используете фильтре на странице другого класса (например modDocument), вам необходимо обязательно указать ID документа класса "msCategory", чтобы при просчете borders скрипт смог вывести правильное значение свойств. Более подробно смотрите примеры работы фильтров
&borders<[[+id]]список идентификторов документов на основе которых происходит построении фильтров, по умолчанию выводит фильтры из родительских документов от текущего
&excludeIdsnullсписок идентификторов документов, через запятую, которые нужно исключить из выборки
&filterTypecategorycategory, product, all - выводит фильтры из соответствующих групп документов.
Фильтры унаследованные от родителей

По умолчанию, при открытии страницы фильтров категории товара наследуются от родителей от самого верхнего элемента дерева являющийся категорией товара. Причем значения фильтров берутся из ближайших категорий к текущей. Например, если в самой верхней в дереве категории свойство с типом список выдает значения "1,2,3", а тоже самое свойство, текущей родительской категории обладает значениями "3,4,5". То в итоге, в фильтре на странице текущей категории, будет выведено "3,4,5". Если же текущая категория обладает этим свойством, то его значение в данном случае, будет приоритетным. Сам же сниппет mFilter2 запускается без параметров определяющих критерии отбора. Можно также указать такую выборку с параметрами будет выглядить, в виде:

modx
[[!mFilter2?...
  &ms2efs_borders=`<[[+id]]`
  &ms2efs_filterType=`category`
]]
Фильтры текущей категории

Для того чтобы фильтр отобразил только свойства текущей категории, нужно передать в параметр borders id текущей категории и указать в filterType, что нужно получить фильтры только из категории:

modx
[[!mFilter2?
  &ms2efs_borders=`[[+id]]`
  &ms2efs_filterType=`category`
]]
Фильтр свойств используемые в подкатегориях

Иногда нужно получить фильтры из всех вложенных подкатегориях. Для этого в параметре borders допустимо использовать знаки "<" и ">". Нужно учесть способ обхода дерева методом getChildIds, что может вернуть неожиданные результаты. На схеме показан пример того, как происходит обход "вниз" по дереву документов, из которого видно что самый последний и глубокий документ это "1-4-2", а на деле вернутся свойства из документа "3-2".

Фильтр свойств используемые в подкатегориях

modx
[[!mFilter2?...
  &ms2efs_borders=`>[[+id]]`
  &ms2efs_filterType=`category`
]]
Выборка свойств из указанных категорий

Для получения свойств только определенных категорий, указываются id документов разделяя их запятыми. Например: &ms2efs_borders=`1,5,2` построит свойства определенные в текущем свойстве. Причем, порядок идентификаторов - не важен, все равно данные будут получены с учетом положения в дереве документов, относительно текущего. Либо можно использовать дипазон в виде знака дефис "-". Значение параметра &ms2efs_borders=`1-5` возвратит свойства из каждой категории попадающей под диапазон, полученной путем обхода дерева документов.

Проще говоря, вы даже можете создать отдельные документы, объявленные как "категория товара" и объявить в них нужные фильтры, эти страницы могут не использоваться на сайте, а служить лишь для корректировки фильтров.

Сбор свойств из товаров

По-мимо получения свойств из категорий, можно возвращать все свойства из товаров, которые допустимо использовать для вывода в фильтре. Причем, учитываются настройки из категорий товаров, если они стоят выше по дереву документов относительно обрабатываемого товара. В таком случае "borders" работает уже в качестве идентификторов товаров.

Получение свойств используемые во всех дочерних товарах:

modx
[[!mFilter2?...
  &ms2efs_borders=`>[[+id]]`
  &ms2efs_filterType=`product`
]]

Получение свойств из определенных товаров:

modx
[[!mFilter2?...
  &ms2efs_borders=`1,2,3`
  &ms2efs_filterType=`product`
]]
Исключение документов из выборки

Вы можете исключать документы из построения фильтров. Это правило, распространяется как на товары так и на категории.

modx
[[!mFilter2?...
  &ms2efs_borders=`1-5`
  &ms2efs_excludeIds=`2,3`
  &ms2efs_filterType=`all`
]]
Комбинация критериев формирующих фильтры

Компонент позволяет гибко управлять наборами фильтров. Например:

modx
[[!mFilter2?...
  &ms2efs_borders=`<5,10-15,7,>12`
]]

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