Сниппеты

05 апреля 2016, 06:49

parseMeasure

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

Параметры

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

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

В виде модификатора на странице товара: [[!+measure:parseMeasure=`prefix=" / "`]]

msExtraFields

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

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

Название По умолчанию Описание
&log_target ECHO FILE - вывод лога в файл;
HTML - вывод на экран с оформлением в html + css;
ECHO, AUTO, SYSTEM - вывод без оформления;
PLACEHOLDER - вывод в плейсхолдер;
&showLog false вывод лога компонентом pdoFetch, при true данные попадают в мой log
&log_status false включает вывод лога компонента msExtraFields, если опция &showLog также включена, то вывод ее лога попадает под действие метода ведения лога текущего компонента
&log_filename false имя файла в который будет отправлен лог, строится в виде конкатенации имени и даты в формате "_Y-m-d__H-i-s". Путь к файлу: MODX_CORE_PATH."cache/logs/".
&log_placeholder log_msExtraFields имя плейсхолдера в который будет передан лог. При ajax ответе значение параметра используется в качестве имени класс объекта, в который будет размещен лог пришедший от сервера. Более подробно смотрите в примерах управления ценой товаров.
&log_detail false записывает доп. информацию о системе в лог
&log_target ECHO FILE - вывод лога в файл;
HTML - вывод на экран с оформлением в html + css;
ECHO, AUTO, SYSTEM - вывод без оформления;
PLACEHOLDER - вывод в плейсхолдер;
&log_isstyled true при &log_target == (HTML или PLACEHOLDER) все строки лога в зависимости от их уровня (INFO, WARN, ERROR) оборачиваются в html теги с применением стилей CSS. Тем самым делая вывод более удобным для восприятия.
&log_selfmsg true записывает в лог только свои сообщения посланные только из текущего компонента
&log_level INFO уровень выводимых сообщений, установлен по умолчанию в конфиге modx, можно передать: INFO, WARN, ERROR, FATAL, DEBUG, либо соответствующее цифровое значение.
&cacheTime 1800 время жизни кеша в секундах (используется также в pdoTools). При выводе товара в режиме редактирования данная настройка используется в ajax запросах, более подробно смотрите в примерах управления ценой товаров.
&cacheUid уникальный идентификатор, формируется при открытии товара в режиме редактирования, служит для сохранения и повторного использования параметров сниппета при ajax зпросах. Генерируется автоматически, но по необходимости можно прописать значение вручную. Неразрывно связан с параметром cacheTime.
&plugins ms2_core_path . 'plugins/' путь к minishop2 с добавлением 'plugins/'.
&plugins_processors ms2_core_path . 'processors/mgr/msextrafields/' путь к файлам процессора.
&tplPath [[+plugins]]msextrafields/chunks путь к файлам чанков. [[+plugins]] - это значение текущего параметра &plugins.
&typeOfData options options - возвращает свойства товара;
getFilters - возвращает свойства внутри фильтра получаемого сниппетом mFilter2;
cart - возвращает свойства товара в корзине;

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

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

Название По умолчанию Описание
&display edit edit, info, short - способ отображения данных, в зависимости от которого имя параметра вызывающего чанк соответвующего свойства формируются следующим образом: "tplProduct" + "тип свойства" + "_" + "значение параметра display" + "" + "row или wrap". В соответствии с этим правилом для каждого свойства вызывается соответствующий чанк.
edit - отрабатывает чанки свойств, в имени параметра которых нет суфикса (info или short), например tplProduct_checkbox_row. Эти чанки позволяют пользователю менять значения свойств, тем самым влияя на уточнение характеристик товара перед его заказом;
info - информативный шаблон (например: tplProduct_checkbox_info_row);
short - только информативный (например: tplProduct_checkbox_short_row), срабатывает если значение поля inshort == 1;
&productId null id документа c классом msProduct или msCategory из которого берутся свойства товара или категории, если не указан,то за основу берется текущий документ
&fastGenerate false при true берет ранее сформированные данные из таблицы ms2_product, поля msextrafields, если страница закеширована или сниппет вызвается закешированным или были произведены изменения в товаре, но сам документ не был сохранен, есть вероятность что данные будут не актуальны!
&fastMode false быстрый режим обработки чанков. Все необработанные теги (условия, сниппеты и т.п.) будут вырезаны (см. pdoTools).
&showUnpublished false при true, выводит все документы включая не опубликованные, иначе только опубликованные
&showDeleted false при true, выводит все документы вместе с теми что помечены на удаление
&showHidden false при true, выводит только также документы у которых установлен параметр "Не показывать в меню"

Пример

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

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

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

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

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

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

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

[[!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 в соответствии с которым у клиента будет отображаться текущее свойство. Для примера разберем следующую запись:

{
  "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"}}.

расписать чем отличается ROW и WRAP;

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

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

[[!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".

[[!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".

[[+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" - он отвечает за построение фильтров в нужном виде.

<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]]' список идентификторов документов на основе которых происходит построении фильтров, по умолчанию выводит фильтры из родительских документов от текущего
&excludeIds null список идентификторов документов, через запятую, которые нужно исключить из выборки
&filterType 'category' category, product, all - выводит фильтры из соответствующих групп документов.
Фильтры унаследованные от родителей

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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