
- MODX 3
- PHP 8.1
- miniShop3


Подключите mxQuickView.initialize один раз в шаблоне.
[[!mxQuickView.initialize]]{'!mxQuickView.initialize'|snippet}[[!mxQuickView.initialize?
&modalSize=`modal-xl`
&mouseoverDelay=`350`
]]{'!mxQuickView.initialize'|snippet:[
'modalSize' => 'modal-xl',
'mouseoverDelay' => 350
]}Базовый URL ресурсов и connector.php: по умолчанию [[++assets_url]]components/mxquickview/. Переопределение — необязательный getOption mxquickview.assets_url (в transport нет).
Чанки поставки (mxqv_product, mxqv_resource) используют Fenom. Установите pdoTools 3.x: процессор разбирает Fenom при отрисовке chunk/template. Без pdoTools в ответе останутся сырые {$…}.
modalLibrary: native (по умолчанию), bootstrap или fancybox.
fancybox вызывает window.Fancybox.show(). Если API Fancybox нет, JS переключает режим на native (разметка #mxqv-modal всегда в HTML). То же без bootstrap.Modal или без #mxqv-bootstrap-modal. Проверка выполняется на старте и повторяется при каждом открытии.
В поставке лежат собственные файлы библиотек:
assets/components/mxquickview/vendor/fancybox/fancybox.css, fancybox.umd.jsassets/components/mxquickview/vendor/bootstrap/bootstrap.min.css, bootstrap.min.jsРядом с ними лежат LICENSE и THIRD_PARTY.txt.
Как выбирается файл: путь из параметра сниппета или из системной настройки приводится к URL (теги [[++assets_url]] разворачиваются) и подключается как есть, без проверки существования. Поиск в assets/components/mxquickview/vendor/... и CDN работают только при пустом значении, то есть если параметр и настройка оставлены пустыми:
vendor/fancybox/, затем CDN @fancyapps/ui без закреплённой версии.vendor/bootstrap/, затем CDN Bootstrap 5.3.2.Внимание
CDN-Bootstrap подключается файлом bootstrap.min.js, он не содержит Popper. Выпадающие списки и всплывающие подсказки Bootstrap в этой ветке не заработают, Popper нужно подключить отдельно. В поставленном bootstrap.min.js Popper есть.
Пути можно задать явно:
[[!mxQuickView.initialize?
&modalLibrary=`fancybox`
&fancyboxCss=`/assets/components/mxquickview/vendor/fancybox/fancybox.css`
&fancyboxJs=`/assets/components/mxquickview/vendor/fancybox/fancybox.umd.js`
]]{'!mxQuickView.initialize'|snippet:[
'modalLibrary' => 'fancybox',
'fancyboxCss' => '/assets/components/mxquickview/vendor/fancybox/fancybox.css',
'fancyboxJs' => '/assets/components/mxquickview/vendor/fancybox/fancybox.umd.js'
]}Для Bootstrap передайте modalLibrary=bootstrap.
Чанк mxqv_resource подходит для любых ресурсов (pagetitle, introtext, content). Добавьте его в mxquickview_allowed_chunk.
<button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_resource"
data-mxqv-id="[[+id]]"
data-mxqv-title="[[+pagetitle]]">
Быстрый просмотр
</button><button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_resource"
data-mxqv-id="{$id}"
data-mxqv-title="{$pagetitle}">
Быстрый просмотр
</button><button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="[[+id]]"
data-mxqv-title="[[+pagetitle]]">
Быстрый просмотр
</button><button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="{$id}"
data-mxqv-title="{$pagetitle}">
Быстрый просмотр
</button>modal + snippet (пример с msCart и широкой модалкой) [[!mxQuickView.initialize?
&modalSize=`modal-xl`
]]
<button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="snippet"
data-mxqv-element="msCart"
data-mxqv-id="[[+id]]"
data-mxqv-title="[[+pagetitle]]">
Быстрый просмотр корзины
</button>{'!mxQuickView.initialize'|snippet:[
'modalSize' => 'modal-xl'
]}
<button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="snippet"
data-mxqv-element="msCart"
data-mxqv-id="{$id}"
data-mxqv-title="{$pagetitle}">
Быстрый просмотр корзины
</button>msCart должен быть в mxquickview_allowed_snippet.
Компактная миникорзина в quick view собирается как msCart + tpl.msMiniCart (по docs.modx.pro). data-mxqv-element="msMiniCart" работает как alias.
<a href="#"
data-mxqv-mouseover
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="[[+id]]"
data-mxqv-title="[[+pagetitle]]">Наведите</a><a href="#"
data-mxqv-mouseover
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="{$id}"
data-mxqv-title="{$pagetitle}">Наведите</a>Задержка: параметр mouseoverDelay перекрывает mxquickview_mouseover_delay. Пустая строка свойства читает настройку (по умолчанию 300 мс).
selector (свой контейнер) <button type="button"
data-mxqv-click
data-mxqv-mode="selector"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="[[+id]]"
data-mxqv-output=".quickview-output">
Загрузить в блок
</button>
<div class="quickview-output"></div><button type="button"
data-mxqv-click
data-mxqv-mode="selector"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="{$id}"
data-mxqv-output=".quickview-output">
Загрузить в блок
</button>
<div class="quickview-output"></div>mouseover + selector <a href="#"
data-mxqv-mouseover
data-mxqv-mode="selector"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="[[+id]]"
data-mxqv-output=".quickview-output">
Наведите для загрузки
</a>
<div class="quickview-output"></div><a href="#"
data-mxqv-mouseover
data-mxqv-mode="selector"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="{$id}"
data-mxqv-output=".quickview-output">
Наведите для загрузки
</a>
<div class="quickview-output"></div>selector <button type="button"
data-bs-toggle="modal"
data-bs-target="#qvBootstrapModal"
data-mxqv-click
data-mxqv-mode="selector"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="[[+id]]"
data-mxqv-output="#qvBootstrapModal .modal-body">
Быстрый просмотр
</button>
<div class="modal fade" id="qvBootstrapModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Быстрый просмотр</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body"></div>
</div>
</div>
</div><button type="button"
data-bs-toggle="modal"
data-bs-target="#qvBootstrapModal"
data-mxqv-click
data-mxqv-mode="selector"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="{$id}"
data-mxqv-output="#qvBootstrapModal .modal-body">
Быстрый просмотр
</button>
<div class="modal fade" id="qvBootstrapModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Быстрый просмотр</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body"></div>
</div>
</div>
</div>Кнопки data-mxqv-nav="prev" и data-mxqv-nav="next" есть только в разметке native и bootstrap. У Fancybox их нет, навигация остаётся на клавишах ← / →, которые работают во всех режимах.
Клавиши ← / → переключают товар в пределах родителя с data-mxqv-loop="true". Escape закрывает модалку только в режиме native.
<div data-mxqv-parent data-mxqv-loop="true">
<button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="[[+id]]"
data-mxqv-title="[[+pagetitle]]">
Быстрый просмотр
</button>
</div><div data-mxqv-parent data-mxqv-loop="true">
<button type="button"
data-mxqv-click
data-mxqv-mode="modal"
data-mxqv-action="chunk"
data-mxqv-element="mxqv_product"
data-mxqv-id="{$id}"
data-mxqv-title="{$pagetitle}">
Быстрый просмотр
</button>
</div>У каждого триггера внутри должны быть свои data-mxqv-action, data-mxqv-element, data-mxqv-id.
ms3-add-to-cart (data-ms3-form, ms3_action=cart/add).ms3.cartUI.init/reinit, ms3.quantityUI.reinit/init, ms3.productCardUI.reinit() и событие ms3:cart:updated (source: 'mxqv'), если MiniShop3 на странице.[[+variants_html]], [[+variants_json]], [[+has_variants]].Данные о вариантах идут от Render через плейсхолдеры в чанк и дальше в разметку, откуда их забирает initVariantsInContent:
msProduct вызывается msProductVariants с параметрами productId, product_id, id.[[+has_variants]] как строка true|false.[[+variants_html]] как HTML выбора варианта от msProductVariants.[[+variants_json]] как JSON массива вариантов (id, price, old_price, sku, count, file_id, options).<div class="qv-product"
data-ms3-product-id="[[+id]]"
data-mxqv-variants="[[+has_variants]]"
data-mxqv-variants-json="[[+variants_json:htmlent]]">
<form method="post" class="ms3_form ms3-add-to-cart" data-ms3-form data-cart-state="add">
<input type="hidden" name="id" value="[[+id]]">
<input type="hidden" name="count" value="1">
<input type="hidden" name="options" value="[]">
<input type="hidden" name="ms3_action" value="cart/add">
<div class="qv-product__variants">[[+variants_html]]</div>
<button type="submit">В корзину</button>
</form>
</div><div class="qv-product"
data-ms3-product-id="{$id}"
data-mxqv-variants="{$has_variants}"
data-mxqv-variants-json="{$variants_json|escape:'html'}">
<form method="post" class="ms3_form ms3-add-to-cart" data-ms3-form data-cart-state="add">
<input type="hidden" name="id" value="{$id}">
<input type="hidden" name="count" value="1">
<input type="hidden" name="options" value="[]">
<input type="hidden" name="ms3_action" value="cart/add">
<div class="qv-product__variants">{$variants_html}</div>
<button type="submit">В корзину</button>
</form>
</div>Переключение вариантов (initVariantsInContent) вызывается и в modal, и в mode=selector.
.qv-product[data-mxqv-variants] и проверяет флаг (true|1|yes|on).data-mxqv-variants-json..qv-product__variants.data-variant-id на самом элементе или на его option.change берёт id из data-variant-id у select/input, из value выбранного option или из value самого поля, если в name есть подстрока variant (так работает разметка ms3Variants).[data-mxqv-price]), old price (.qv-product__price-old) и изображение (.qv-product__thumb, если есть data-thumb или data-image).Если варианта нет в data-mxqv-variants-json, цена и старая цена берутся из атрибутов самого элемента: data-price и data-old-price.
usePackages, includeThumbs, msProducts, pdoPage: это API MiniShop3 и pdoTools. Варианты в список подставляет сниппет msProductVariants, который mxQuickView вызывает с параметрами productId, product_id и id.usePackagesmxQuickView.initialize.allowed_chunk, allowed_snippet, allowed_template).data-mxqv-id.selector нет целевого контейнера data-mxqv-output.Access denied).