Skip to content
mxQuickView
mxQuickView
Быстрый просмотр карточки товара и любых ресурсов по AJAX для MODX 3
  • MODX 3
  • PHP 8.1
  • miniShop3
  1. Компоненты
  2. mxQuickView
  3. Для разработчика

API и интерфейсы ​

Сниппет mxQuickView.initialize ​

Подключает CSS/JS быстрого просмотра и выводит HTML встроенной модалки.

Параметры ​

ПараметрПо умолчаниюОписание
modalSizeнепустое свойство перекрывает mxquickview_modal_size (в transport modal-lg)Классы modal-sm, modal-lg, modal-xl только для native и bootstrap. В native значение переводится в класс qv-modal__box--sm/lg/xl (неизвестное значение даёт --lg), в bootstrap подставляется в modal-dialog
mouseoverDelayнепустое свойство перекрывает mxquickview_mouseover_delayЗадержка наведения в мс. Пустая строка свойства = «не задано»: читается настройка (по умолчанию 300)
modalLibrarynativenative, bootstrap, fancybox (bootstrap5 alias). Нет window.bootstrap.Modal или нет #mxqv-bootstrap-modal → native. Нет Fancybox API (Fancybox.show) → native. Проверка повторяется при каждом открытии: если API пропал уже после инициализации, компонент переключается на native
debugmxquickview_debug, если параметр не переданЛог [mxqv] в консоли. В карточке сниппета в панели управления поля нет, работает через scriptProperties
loadingTextлексикон mxqv_loadingТекст загрузки в modal/selector. Не в свойствах transport сниппета, только scriptProperties
fancyboxCssmxquickview_fancybox_css, если параметр не задан или пустойURL/путь к CSS Fancybox. Непустое значение используется как есть, без проверки существования файла. Пусто — поиск в vendor/fancybox/, затем CDN @fancyapps/ui
fancyboxJsто жеJS Fancybox
bootstrapCssто жеCSS Bootstrap для modalLibrary=bootstrap
bootstrapJsто жеJS Bootstrap

data-атрибуты триггера ​

Читаются с элемента, на который повешен быстрый просмотр.

АтрибутОписание
data-mxqv-clickЗагрузка по клику
data-mxqv-mouseoverЗагрузка по наведению
data-mxqv-modeРежим вывода: modal или selector (по умолчанию modal)
data-mxqv-actionТип отрисовки: chunk, snippet, template (по умолчанию chunk)
data-mxqv-elementИмя/ID элемента для отрисовки (чанк, сниппет, шаблон)
data-mxqv-idID ресурса
data-mxqv-titleЗаголовок модалки для mode=modal
data-mxqv-outputCSS selector контейнера для mode=selector
data-mxqv-contextКлюч контекста (несколько языков или сайтов)
data-mxqv-parentКонтейнер списка для loop
data-mxqv-looptrue — собрать соседние триггеры для prev/next (только клик, не mouseover)

data-атрибуты разметки компонента ​

Их ставит сам компонент или чанк, вручную задавать не нужно.

АтрибутГде появляетсяОписание
data-mxqv-navразметка native и bootstrapКнопка навигации, значение prev или next. На границах списка кнопка скрывается
data-mxqv-closeразметка native и bootstrapКнопка закрытия
data-mxqv-fancybox-titleзаголовок внутри .mxqv-fancybox-contentЗаголовок окна Fancybox
data-mxqv-variantsчанк товара, .qv-productФлаг наличия вариантов, обрабатываются значения true, 1, yes, on
data-mxqv-variants-jsonчанк товара, .qv-productJSON массива вариантов для пересчёта цены на клиенте
data-mxqv-priceчанк товараЭлемент, в который пишется текущая цена выбранного варианта
data-mxqv-ms3-render-tokenконнектор, .mxqv-ms3-renderТокен рендера MiniShop3, переносится в ms3Config.render.cart
data-mxqv-ms3-render-selectorконнектор, .mxqv-ms3-renderCSS selector контейнера корзины, необязательный

Плейсхолдеры чанков поставки ​

mxqv_product (карточка товара)

ПлейсхолдерИсточник
idполе ресурса
pagetitleполе ресурса
articleполе msProductData (артикул MiniShop3)
descriptionmsProductData.description либо поле ресурса
pricemsProductData.price
old_pricemsProductData.old_price
thumbmsProductData.thumb, иначе картинка-заглушка MiniShop3
assets_urlсистемная настройка assets_url
has_variantstrue или false, зависит от ms3Variants
variants_htmlразметка выбора варианта от msProductVariants
variants_jsonJSON вариантов: id, sku, price, old_price, count, file_id, options

mxqv_resource (страница, статья, новость)

ПлейсхолдерИсточник
idполе ресурса
pagetitleполе ресурса
introtextполе ресурса
contentполе ресурса

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

modx
[[!mxQuickView.initialize?
  &modalSize=`modal-xl`
  &mouseoverDelay=`350`
  &modalLibrary=`native`
  &debug=`1`
  &loadingText=`Загрузка...`
]]
fenom
{'!mxQuickView.initialize'|snippet:[
  'modalSize' => 'modal-xl',
  'mouseoverDelay' => 350,
  'modalLibrary' => 'native',
  'debug' => 1,
  'loadingText' => 'Загрузка...'
]}

Что добавляет на страницу ​

  • <link ... mxqv.min.css?v=filemtime> (если mxqv.min.css нет, запасной mxqv.css)
  • <script>window.mxqvConfig = ...</script>
  • <script src="...mxqv.min.js?v=filemtime" defer></script> (если mxqv.min.js нет, запасной mxqv.js)
  • разметку нативной модалки (#mxqv-modal-backdrop, #mxqv-modal)
  • при modalLibrary=bootstrap — контейнер #mxqv-bootstrap-modal и Bootstrap. Путь берётся из bootstrapCss/bootstrapJs (или системных настроек) как есть; значение по умолчанию указывает на файлы в assets/components/mxquickview/vendor/bootstrap/. Только при пустом значении идёт поиск файла в vendor/bootstrap/, затем CDN bootstrap@5.3.2
  • при modalLibrary=fancybox — Fancybox. Путь берётся из fancyboxCss/fancyboxJs (или системных настроек) как есть; значение по умолчанию указывает на файлы в assets/components/mxquickview/vendor/fancybox/. Только при пустом значении идёт поиск файла в vendor/fancybox/, затем CDN @fancyapps/ui

CSS переменные нативной модалки ​

Для modalLibrary=native объявлены в assets/components/mxquickview/css/mxqv.css.

Полный список переменных ​

ПеременнаяПо умолчаниюНазначение
--mxqv-backdrop-bgrgba(0, 0, 0, 0.5)Фон backdrop
--mxqv-backdrop-z-index1050Z-index backdrop
--mxqv-backdrop-padding-mobile0Отступы backdrop на мобильных
--mxqv-backdrop-padding-tablet1remОтступы backdrop на tablet/desktop
--mxqv-modal-bg#fffЦвет фона модалки
--mxqv-modal-radius-mobile0Скругление модалки на мобильных
--mxqv-modal-radius-tablet0.25remСкругление модалки на tablet/desktop
--mxqv-modal-shadow0 0.5rem 1rem rgba(0, 0, 0, 0.15)Тень модалки
--mxqv-modal-width-mobile100%Рабочая ширина модалки на мобильных
--mxqv-modal-width-tablet90vwРабочая ширина модалки на tablet/desktop
--mxqv-modal-max-width-mobile100%Максимальная ширина модалки на мобильных
--mxqv-modal-max-width-tablet90vwМаксимальная ширина модалки на tablet/desktop
--mxqv-modal-max-height-mobile100%Максимальная высота модалки на мобильных
--mxqv-modal-max-height-tablet90vhМаксимальная высота модалки на tablet/desktop
--mxqv-modal-size-sm24remМаксимальная ширина размера modal-sm
--mxqv-modal-size-lg50remМаксимальная ширина размера modal-lg
--mxqv-modal-size-xl70remМаксимальная ширина размера modal-xl
--mxqv-header-gap0.5remРасстояние между элементами header
--mxqv-header-padding1rem 1.25remОтступы заголовка
--mxqv-header-border-color#dee2e6Граница заголовка
--mxqv-title-font-size1.25remРазмер шрифта заголовка
--mxqv-title-font-weight600Насыщенность заголовка
--mxqv-actions-gap0.25remРасстояние между кнопками действий
--mxqv-btn-padding0.25rem 0.5remОтступы кнопок управления
--mxqv-btn-radius0.25remСкругление кнопок управления
--mxqv-btn-font-size1.25remРазмер шрифта кнопок управления
--mxqv-close-font-size1.5remРазмер кнопки закрытия
--mxqv-body-padding1.25remОтступы body
--mxqv-btn-hover-bg#f0f0f0Фон кнопок в header при наведении
--mxqv-loading-color#6c757dЦвет текста индикатора загрузки
--mxqv-loading-padding1rem 0Отступы индикатора загрузки

Пример переопределения ​

css
:root {
  --mxqv-modal-size-lg: 56rem;
  --mxqv-modal-size-xl: 76rem;
  --mxqv-modal-bg: #ffffff;
  --mxqv-header-border-color: #e9ecef;
  --mxqv-backdrop-bg: rgba(0, 0, 0, 0.6);
}

Коннектор assets/components/mxquickview/connector.php ​

Коннектор принимает только POST с action=render и отвечает JSON.

Точка входа ​

  • Метод: POST
  • Content-Type запроса: application/x-www-form-urlencoded
  • Ответ: JSON { success, html?, message? }

Параметры POST ​

ПараметрОбязательныйОписание
actionдаТолько render
data_actionнетchunk, snippet, template (по умолчанию chunk)
elementдаИмя чанка/сниппета/шаблона
idдаID ресурса (целое > 0)
contextнетКлюч контекста. Если невалиден, берётся web
modeнетmodal или selector. Учитывается только в renderSnippet для msCart / msMiniCart
outputнетCSS selector контейнера. Только для msCart при mode=selector (параметр selector сниппета)

Успешный ответ ​

json
{
  "success": true,
  "html": "<div>...</div>"
}

Ответ с ошибкой ​

json
{
  "success": false,
  "message": "Chunk not allowed",
  "html": ""
}

Ошибки и сообщения ​

В JSON поле message содержит готовую строку, не ключ. До загрузки MODX коннектор отдаёт английские литералы.

УсловиеКлюч лексиконаRUEN
Метод не POSTmxqv_invalid_request есть в лексиконе, PHP не вызываетвсегда Invalid request method
action != rendermxqv_invalid_actionлексикон: Недопустимое действие
Не найден index.phpmxqv_index_not_found есть в лексиконе, PHP не вызываетвсегда index.php not found
element пуст или id <= 0mxqv_missing_element_or_idНе переданы element или idMissing element or id
Ресурс не найденmxqv_resource_not_foundРесурс не найденResource not found
Нет права просмотраmxqv_access_deniedДоступ запрещёнAccess denied
Чанк не в белом спискеmxqv_chunk_not_allowedЧанк не разрешёнChunk not allowed
Чанк не найденmxqv_chunk_not_foundЧанк не найденChunk not found
Сниппет не в белом спискеmxqv_snippet_not_allowedСниппет не разрешёнSnippet not allowed
Сниппет не найденmxqv_snippet_not_foundСниппет не найденSnippet not found
Шаблон не в белом спискеmxqv_template_not_allowedШаблон не разрешёнTemplate not allowed
Шаблон не найденmxqv_template_not_foundШаблон не найденTemplate not found
Неподдерживаемый data_actionmxqv_invalid_data_actionНедопустимый тип рендераInvalid action

Имя сниппета в POST element для data_action=snippet: ведущий ! снимается (Render.php).

JS API (через события) ​

Отдельного объекта API нет. События CustomEvent публикуются на document:

СобытиеКогдаdetail
mxqv:openмодалка открыта{ title }
mxqv:closeмодалка закрыта—
mxqv:loadedконтент вставлен в модалку{ content }
ms3:cart:updatedпосле reinitIntegrations(){ source: 'mxqv' }

Клавиатура (modal открыта) ​

  • Escape: обрабатывается компонентом только при modalLibrary=native. В bootstrap окно закрывает сам Bootstrap, в fancybox — Fancybox.
  • ← / →: prev/next в списке loop. Проверяются только факт открытой модалки и индекс, поэтому работают во всех режимах, включая fancybox.

Кнопки prev/next ​

Кнопки [data-mxqv-nav="prev|next"] есть только в разметке native и bootstrap. В fancybox updateNavButtons() не выполняется, кнопок нет; переключение остаётся на клавишах ← / →.

Маркеры msCart / ms3 render ​

После отрисовки msCart в HTML добавляется скрытый <span class="mxqv-ms3-render"> с:

  • data-mxqv-ms3-render-token — токен для ms3Config.render.cart
  • data-mxqv-ms3-render-selector — необязательный CSS selector контейнера корзины

Маркер появляется только при работающем сервисе MiniShop3 ms3_token_service с методом generateSnippetToken. Без него msCart отрисуется, но токен в ms3Config.render.cart не попадёт.

JS переносит token в window.ms3Config.render.cart без inline-script. Если у контейнера, в который вставлен ответ, нет id, компонент генерирует его сам: mxqv-ms3-cart-{timestamp}-{random}, и этот id подставляется в selector записи рендера.

Пример запроса ​

javascript
const response = await fetch('/assets/components/mxquickview/connector.php', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    action: 'render',
    data_action: 'chunk',
    element: 'mxqv_product',
    id: '7'
  })
});

const data = await response.json();