Gallery3x: вставка галерей в визуальный редактор
Вставка галерей в визуальный редактор
Компонент Gallery3x добавляет в визуальный редактор MODX кнопку «Вставить из галереи». Она открывает окно выбора изображений текущего ресурса и вставляет в текст готовый вызов сниппета (или тег <img>) с ID выбранных фото. В зависимости от выбранного «вида вывода» в вызов подставляются разные чанки — сетка Fancybox, карусель, простые миниатюры и т.д.
Поддерживаемые редакторы
- CKEditor — аддон
ckeditor1.4.x (CKEditor 4); - TinyMCE RTE — аддон
tinymcerte3.x (TinyMCE 6).
Адаптер выбирается автоматически: скрипты Gallery3x сами определяют, какой редактор загружен на странице, и молча отключаются, если «их» редактора нет. Настройки самих аддонов CKEditor / TinyMCE RTE менять не нужно — кнопка регистрируется программно.
Включение и настройка
Все настройки находятся в системных настройках MODX, пространство имён gallery3x, раздел «Визуальный редактор (RTE)».
| Настройка | По умолчанию | Описание |
|---|---|---|
gallery3x.rte_enable |
Нет | Включает кнопку галереи в визуальном редакторе. Главный выключатель. |
gallery3x.rte_templates |
пусто | На каких шаблонах показывать кнопку: • пусто — использовать список из gallery3x.templates (там же, где вкладка галереи);• * — на всех шаблонах;• 5,10 — только на шаблонах с этими ID. |
gallery3x.rte_views |
пусто | JSON-массив «видов вывода» для окна вставки. Пусто — стандартный набор (см. ниже). |
После включения настройки откройте ресурс с визуальным редактором — кнопка появится в тулбаре (в CKEditor — отдельной группой в конце, в TinyMCE — в конце первого ряда). Если кнопки нет — обновите страницу менеджера со сбросом кэша браузера (Ctrl+F5).
Окно выбора изображений
По клику на кнопку открывается окно со всеми изображениями текущего ресурса:
- Фильтр по группе — слева вверху; кнопка «Сбросить» возвращает все фото;
- Миниатюры — клик выбирает/снимает фото (Ctrl не нужен), выбор работает и между страницами пагинации;
- Порядок кликов запоминается — фото будут выведены на странице именно в той последовательности, в которой вы их выбирали;
- Счётчик «Выбрано: N» и кнопка «Сбросить выбор» — справа вверху;
- внизу — параметры вставки (см. следующий раздел) и кнопки «Вставить» / «Отмена».
Режимы вставки
| Режим («Что вставить») | Что попадёт в текст | Поведение |
|---|---|---|
| Выбранные фото | [[!Gallery3x? &ids=`17,5,42` &tplOuter=`...` &tplThumb=`...`]] |
Выводятся ровно эти фото, в порядке кликов. Состав фиксированный. |
| Всю группу (динамически) | [[!Gallery3x? &group=`Имя группы` &resource=`12` &tplOuter=`...`]] |
Выводятся все фото группы. Если позже в группу добавить фото — они появятся на странице автоматически. |
| Все фото ресурса | [[!Gallery3x? &resource=`12` &tplOuter=`...`]] |
Вся галерея ресурса, тоже динамически. |
| Вид «Одиночное фото (тег img)» | <img src="[[g3xGetImage? &input=`17` &options=`medium`]]" alt="..."> |
На каждое выбранное фото вставляется отдельный <img>. Размер выбирается в поле «Размер фото» (thumb / small / medium / large / original). Адрес картинки вычисляется по ID при выводе страницы, поэтому переживает перегенерацию превью. |
Флажок «Некэшированный вызов» (включён по умолчанию) вставляет тег как [[!Gallery3x?...]]. Для одиночных фото вызов всегда кэшированный — это безопасно и быстрее.
Виды вывода
«Вид вывода» определяет, какая пара чанков подставится в вызов сниппета. Стандартный набор:
| Вид | tplOuter | tplThumb |
|---|---|---|
| Fancybox: сетка | tpl.Gallery3x.Fancybox.GridOuter |
tpl.Gallery3x.Fancybox.GridItem |
| Fancybox: фото + миниатюры | tpl.Gallery3x.Fancybox.outer |
tpl.Gallery3x.Fancybox.thumbItem |
| Карусель (lightGallery) | tpl.Gallery3x.carousel.outer |
tpl.Gallery3x.carousel.item |
| Простые миниатюры | tpl.Gallery3x.static_thumbnails.outer |
tpl.Gallery3x.static_thumbnails |
| Одиночное фото (тег img) | специальный вид — вставляет <img>, чанки не используются |
|
Свои виды вывода (gallery3x.rte_views)
Набор видов задаётся JSON-массивом в настройке gallery3x.rte_views. Каждый элемент массива — один пункт выпадающего списка «Вид вывода» в окне вставки.
Важно знать перед настройкой:
- Настройка заменяет весь набор целиком, а не дополняет его. Если стандартные виды нужны — включите их в JSON тоже (готовый блок — в примере 1).
- Порядок элементов в JSON = порядок в выпадающем списке; первый элемент выбран по умолчанию. Вид «Одиночное фото (тег img)» добавляется в конец списка всегда автоматически.
- Вид «зашивается» в тег при вставке. Изменение
gallery3x.rte_viewsвлияет только на будущие вставки — уже вставленные в контент теги не изменятся (но их можно править руками прямо в тексте). - После изменения настройки перезагрузите страницу редактирования ресурса — конфиг читается при её открытии.
- Кавычки внутри значений JSON экранируются как
\"(см. пример 4).
| Поле | Обязательное | Описание |
|---|---|---|
key |
да | Уникальный ключ вида (латиницей, без пробелов). |
label |
да | Название в выпадающем списке окна вставки. |
tplOuter |
да | Чанк-обёртка, подставится в &tplOuter. |
tplThumb |
обычно да | Чанк элемента, подставится в &tplThumb. Можно опустить, если обёртка сама перебирает файлы (Fenom/@INLINE, см. пример 6). |
snippet |
нет | Имя вызываемого сниппета. По умолчанию Gallery3x (пример 5). |
fenom |
нет | true — добавить в вызов &fenom=`1` (чанки в синтаксисе Fenom, нужен pdoTools). |
extra |
нет | Строка с любыми дополнительными параметрами сниппета, добавляется в конец вызова как есть: &limit, &offset, &sortby, &sortdir, &where, &showInactive и т.д. |
Пример 1. Стандартный набор + свой вид
Самый частый случай: оставить всё как было и добавить один свой вид. Ниже — полный JSON стандартного набора, к которому в конец добавлен вид «Моя сетка» на собственных чанках:
[
{"key": "fancybox_grid", "label": "Fancybox: сетка", "tplOuter": "tpl.Gallery3x.Fancybox.GridOuter", "tplThumb": "tpl.Gallery3x.Fancybox.GridItem"},
{"key": "fancybox", "label": "Fancybox: фото + миниатюры", "tplOuter": "tpl.Gallery3x.Fancybox.outer", "tplThumb": "tpl.Gallery3x.Fancybox.thumbItem"},
{"key": "carousel", "label": "Карусель (lightGallery)", "tplOuter": "tpl.Gallery3x.carousel.outer", "tplThumb": "tpl.Gallery3x.carousel.item"},
{"key": "static", "label": "Простые миниатюры", "tplOuter": "tpl.Gallery3x.static_thumbnails.outer", "tplThumb": "tpl.Gallery3x.static_thumbnails"},
{"key": "my_grid", "label": "Моя сетка", "tplOuter": "tpl.My.GridOuter", "tplThumb": "tpl.My.GridItem"}
]
При выборе «Моя сетка» и трёх фото в текст вставится:
[[!Gallery3x? &ids=`17,5,42` &tplOuter=`tpl.My.GridOuter` &tplThumb=`tpl.My.GridItem`]]
Пример 2. Fenom-виды на готовых чанках компонента
В составе Gallery3x уже есть Fenom-варианты чанков Fancybox — их можно подключить отдельными видами (нужен pdoTools):
[
{"key": "fancybox_grid", "label": "Fancybox: сетка", "tplOuter": "tpl.Gallery3x.Fancybox.GridOuter", "tplThumb": "tpl.Gallery3x.Fancybox.GridItem"},
{"key": "fb_grid_fenom", "label": "Fancybox: сетка (Fenom)", "tplOuter": "tpl.Gallery3x.Fancybox.GridOuter.fenom", "tplThumb": "tpl.Gallery3x.Fancybox.GridItem.fenom", "fenom": true}
]
Что вставится:
[[!Gallery3x? &ids=`17,5,42` &tplOuter=`tpl.Gallery3x.Fancybox.GridOuter.fenom` &tplThumb=`tpl.Gallery3x.Fancybox.GridItem.fenom` &fenom=`1`]]
Пример 3. Дополнительные параметры через extra: лимит и сортировка
Поле extra — точка расширения: любые параметры сниппета Gallery3x допишутся в конец вызова. Вид «Последние 6 фото» (удобен с режимами «Вся группа» / «Все фото ресурса» — лимит и сортировка применятся к динамической выборке):
[
{"key": "last6", "label": "Последние 6 фото", "tplOuter": "tpl.Gallery3x.Fancybox.GridOuter", "tplThumb": "tpl.Gallery3x.Fancybox.GridItem", "extra": "&limit=`6` &sortby=`createdon` &sortdir=`DESC`"}
]
Что вставится (режим «Все фото ресурса»):
[[!Gallery3x? &resource=`12` &tplOuter=`tpl.Gallery3x.Fancybox.GridOuter` &tplThumb=`tpl.Gallery3x.Fancybox.GridItem` &limit=`6` &sortby=`createdon` &sortdir=`DESC`]]
Пример 4. Фильтр по полям через &where (экранирование кавычек)
Параметр &where принимает JSON — внутри значения настройки его кавычки надо экранировать обратной косой: \". Вид «Только особенные фото» (поле special, звёздочка в галерее):
[
{"key": "special", "label": "Только особенные фото", "tplOuter": "tpl.Gallery3x.Fancybox.GridOuter", "tplThumb": "tpl.Gallery3x.Fancybox.GridItem", "extra": "&where=`{\"special\":1}`"}
]
Аналогично можно фильтровать по любым полям изображения: {\"extra_num\":2024}, {\"description:!=\":\"\"} и т.д.
Пример 5. Свой сниппет вместо Gallery3x
Если у вас есть сниппет-обёртка со своей логикой (свои дефолты, кэширование, обработка), укажите его в поле snippet — кнопка будет вставлять вызов именно его, передавая те же параметры (&ids / &group / &resource и чанки):
[
{"key": "my_slider", "label": "Слайдер (свой сниппет)", "snippet": "MySlider", "tplOuter": "tpl.MySlider.outer", "tplThumb": "tpl.MySlider.item", "extra": "&autoplay=`1` &interval=`5000`"}
]
Что вставится:
[[!MySlider? &ids=`17,5,42` &tplOuter=`tpl.MySlider.outer` &tplThumb=`tpl.MySlider.item` &autoplay=`1` &interval=`5000`]]
Пример 6. @INLINE-шаблон без отдельного чанка (продвинутый, нужен pdoTools)
С "fenom": true обёртку можно задать прямо строкой @INLINE — без создания чанка. Внутри доступен массив $files (все поля фото + URL всех размеров: small_url, medium_url, large_url, original_url). tplThumb в этом случае не нужен:
[
{"key": "inline_row", "label": "Ряд миниатюр (inline)", "fenom": true, "tplOuter": "@INLINE {foreach $files as $f}<a href=\"{$f.original_url}\"><img src=\"{$f.small_url}\" alt=\"{$f.alt}\"></a>{/foreach}"}
]
Такой вид удобен для мелких служебных вставок, когда заводить чанк избыточно. Для чего-то сложнее пары строк лучше всё же создать чанк — его проще править и переиспользовать.
Типовые ошибки
- Забыли включить стандартные виды в свой JSON — в списке останутся только ваши (это не поломка, но часто неожиданность).
- Невалидный JSON (лишняя запятая, неэкранированные кавычки) — компонент откатится на стандартный набор и запишет предупреждение в журнал ошибок MODX (Управление → Журнал ошибок).
- Опечатка в имени чанка — вызов вставится, но на странице галерея не выведется; проверьте имена в дереве «Элементы».
- Fenom-чанк без
"fenom": true(или без установленного pdoTools) — на странице будет сырой текст шаблона вместо галереи.
Изменения в сниппетах
Gallery3x: параметр &ids
&ids=`17,5,42` — вывод конкретных изображений по их ID (именно этот параметр использует режим «Выбранные фото»).
- ID изображения уникален на весь сайт и сам однозначно определяет фото, поэтому параметры выбора по ресурсам (
&resource/&resources/&parents) в вызове с&idsне нужны и не учитываются. Иначе фото, прикреплённое к другому ресурсу, молча пропадало бы из вывода. - Порядок вывода равен порядку перечисления ID; его можно переопределить обычным
&sortby. - Фильтр активности (
active = 1), а также&where,&limit,&showInactiveдействуют как обычно. - Обратная совместимость полная: на вызовы без
&idsизменение не влияет — выполняется прежний код выборки по ресурсам.
g3xGetImage: размер original
[[g3xGetImage? &input=`17` &options=`original`]] теперь возвращает URL оригинального файла (раньше были доступны только размеры превью: thumb, small, medium, large).
Возможные проблемы и решения
| Симптом | Причина и решение |
|---|---|
| Кнопки нет в тулбаре | Проверьте: gallery3x.rte_enable = Да; шаблон ресурса входит в gallery3x.rte_templates (или gallery3x.templates, если первая пуста); страница менеджера обновлена с Ctrl+F5. |
| Кнопка без иконки (пустой квадрат) | Браузер держит старый CSS/JS — обновите менеджер с Ctrl+F5. |
| CKEditor: кнопки нет при нестандартном тулбаре | Если тулбар CKEditor задан нестандартной конфигурацией, добавьте кнопку Gallery3x в неё вручную. |
TinyMCE: в сохранённом тексте & вместо & внутри тега MODX |
Это нормально: MODX-парсер понимает & в параметрах тегов, вывод работает. |
TinyMCE искажает src у одиночного фото |
Зависит от настроек конвертации URL аддона — установите tinymcerte.relative_urls = Нет. |
| Галерея не выводится на странице | Убедитесь, что чанки выбранного вида существуют, а вызов вставлен некэшированным ([[!...]]), если содержимое должно обновляться. |
Техническая справка
core/components/gallery3x/elements/plugins/plugin.gallery3x_rte.php— MODX-плагин (событиеOnDocFormPrerender): проверяет настройки и шаблон, передаёт конфиг в JS, подключает скрипты и стили;assets/components/gallery3x/js/mgr/rte/gallery3x.rte.picker.js— окно выбора (ExtJS), редактор-независимое ядро:Gallery3x.rte.openPicker(callback);assets/components/gallery3x/js/mgr/rte/gallery3x.rte.ckeditor.js— адаптер CKEditor 4: регистрирует плагин и кнопку черезCKEDITOR.plugins.add+ событиеinstanceCreated/configLoaded;assets/components/gallery3x/js/mgr/rte/gallery3x.rte.tinymce.js— адаптер TinyMCE 6: регистрирует плагин черезtinymce.PluginManager.addи дописываетgallery3xвplugins/toolbar1объектаTinyMCERTE.editorConfigдо вызоваtinymce.init();assets/components/gallery3x/css/mgr/rte.picker.css— стили окна и иконка кнопки CKEditor;assets/components/gallery3x/gallery3x-icon.svg— фирменная иконка Gallery3x (мастер-копия).
Данные окно берёт через штатный коннектор компонента (connector.php, процессоры File\GetList и процессор групп из gallery3x.groups_processor) — работает только в контексте менеджера с активной сессией.
Чтобы подключить другой редактор, достаточно написать новый адаптер, который по своему событию вызывает Gallery3x.rte.openPicker(function (html) { /* вставка html в редактор */ }).