Урок 15. Создание слайдера с помощью MIGx TV
В этом занятии мы рассмотрим основы MIGX и поработаем над новым слайдером, который можно использовать в своём блоге.
Конечный результат того, что мы сделаем, будет приблизительно такой слайдер
Требования:
- MODX Revolution сайт.
- Установлен MIGX пользовательский тип Переменных шаблона (через управление пакетов).
- Слайдер или скрипт галереи, который бы мы хотели интегрировать. Я использовал FlexSlider студии WooThemes так как он подгоняет себя под ширину контейнера (что очень важно для отзывчивого дизайна!). Также он легко конфигурируем, поддерживает прокрутку на смартфонах и выглядит просто отлично без доработок.
- Установленный сниппет phpthumbof через Менеджер пакетов для автообрезания изображений.
- Какие-либо изображения!
Начинаем
В работе используется несколько частей. Вначале нужно установить MIGX TV и нам нужно взять эти данные из фронт-энда и заставить наш слайдер работать. Этот урок подразумевает использование FlexSlider, мы убедимся в том, что разметка – это то, что ему нужно, но также это должно быть очень легко адаптироваться под другие слайдеры.
Шаг 1:Установка MIGX TV для управления изображениями
Давайте начнём с установки TV. Сила MIGX в том, что вы можете определять нужные вам поля. Вы будете видеть их как таблицу и нужно лишь дать названия заголовкам. В этом случае мне нужны будут три разных поля:
- Поле ввода для выбора изображения в файловой системе (или в 2.2 от ваших медиа источников).
- Поле ввода текста для ввода подписи / тега / описания. FlexSlider отлично справляется с подписями, поэтому будем их и использовать.
- Также я добавил ввод текста для "Set". Как мы позже увидим, я им воспользуюсь для бесконечного количества отдельных слайдеров, которые будут добавляться из любой точки ресурса..
Вы можете использовать другие поля, если хотите, но урок будет подразумевать именно те поля, которые я привёл выше.
Давайте перейдём к созданию TV. Вот слайдер с описанием изображений (для случая, если в миниизображении ничего не видно).
Создайте новую переменную шаблона во вкладке «Элементы» и дайте ей соответствующее название. Я назову её ws.images, если вы дадите ей своё название, то не забудьте заменить [[*ws.images]] на ваше название. Во вкладке Тип ввода (Input Options) выберите тип "migx" из выпадающего меню. Если вы не видите этот тип, то проверьте установили ли вы MIGX пакет через Управление дополнениями (Package Manager). Вы заметите, что несколько опций было добавлено внизу экрана, включая Вкладки формы (Form Tabs) и Разметка колонок (Grid Columns). Данное применимо к версии MODX >2.0, для более ранних версий рекомендую обновиться.

Обратите внимание: поля «Вкладки формы» (Form Tabs) и «Разметка колонок» (Grid Columns) должны быть заполнены корректными JSON строками. JSON – это в общем способ показа объектов, массивов или комбинаций ключ -> значение способом, который поддерживает почти любой язык программирования. Вот техническая спецификация и несколько примеров с официального сайта JSON.
Установка Вкладок формы
Форма позволяет использовать различные вкладки. Каждая вкладка имеет описание и несколько полей. Вы можете сделать много продвинутых вещей с этим, так как в большинстве случаев будете использовать одиночную вкладку, поэтому сейчас запомните просто на будущее. Вот JSON код для Вкладок формы (Form Tabs), который я использую:

Давайте пройдёмся по каждой строчке:
- Первая – показывает открытие массива вкладок квадратной скобкой ( [ ), и открывающийся объект вкладки фигурной скобкой ( { ). После этого мы определяем подпись (caption) поля Image. Обратите внимание, что нужно использовать двойные кавычки ( " " ) для свойств и их значений, одинарные могут привести к неожиданным результатам. Если у вас эти скобки попадутся в любых свойствах, значениях, экранируйте их слешем ( \ ). После определения описания (caption) давайте продолжим и начнём определять массив «полей», открывая его квадратными скобками ( [ ).
- Мы определим наше первое поле как set. "field": “set”, значит, что мы хотим иметь в этом поле ввод обычного текста. “Caption”:”Set” – мы даём описание названия "set" – это будет название для ввода обычного текста. Далее дадим ему подпись "Set", которая будет показана в форме как метка поля.
- Далее определим поле описания таким же образом
- 4 строчка определяет изображение. Что здесь особенного – мы используем еще одну ТВ (с именем "image") как тип ввода. Это очень сильная особенность MIGX, которая позволяет вам использовать другие ТВ для построения вашей формы. В этом случае ТВ "image" очень проста: тип ввода – изображение, и в 2.2 вы можете назначать её к правильному медиа источнику. Вам не нужно связывать её с шаблонами как нужно делать в случае с обычной ТВ. Другой способ, сделать это (который я использую в других MIGX TV) – это сделать радио-боксы или селект-боксы.
- Пятая строка закрывает массив полей. Также обратите внимание, что последняя строчка определяющая поле (изображение) не заканчивается запятой – это важно! Если вы поставите запятую в массиве, он JSON не будет обработан и ваша форма не будет работать.
- Шестая строка закрывает объект-вкладку и весь массив вкладок.
Итак, таким образом мы создали "image" TV! У вас должна уже работать форма для заполнения данных, но для их показа нужна разметка…
Установка Разметки колонок
Разметка колонок – это таблица на ТВ панели ресурса. Вам нужно определить заголовки для этой таблицы через опции ввода Разметки колонок. Вот (снова JSON) определение, что я использую:
Пройдёмся по каждой строке:
- Открываем массив заголовков квадратными скобками ( [ ) и заголовок пятой колонки фигурной скобкой ( { ).
- Даём название заголовку "Set" указываем, что он может сортироваться (sortable) и указываем параметр "set", что отвечает определению Набор вкладок формы (Set Form Tabs), которые имеют "field":"set".
- Конец Set / начало Description
- Даём название заголовку "Description", сортируемый и сопоставляем его с полем description dataIndex.
- Конец Description / начало Image
- Дайте название заголовку "Image", несортируемый и сопоставьте его с полем dataIndex - image. Также определим рендерер, который в ExtJS позволит вам изменить вид выводимых данных. В данном случае "this.renderImage" рендерер автоматически возьмёт урл выбранного изображения и сформирует миниатюру вместо него.
- Окончание объекта Image и массива заголовков.
После этого вы можете назначить эту MIGX TV к вашему шаблону и проверить результат работы. Не показывается разметка? Идите назад к вкладкам и убедитесь, что все значения заключены в двойные кавычки, а не одинарные и проверьте нет ли лишних запятых.
Далее всё просто:
- Заполните данные
- Выведите данные на сайт
Заполним произвольными данными нашу переменную шаблона ws.image

Если вы попытаетесь вывести эти данные как обычную ТВ, то увидите приблизительно следующее:
Это JSON массив с введенными полями и значениями!
Так как MIGX идёт в комплекте со сниппетом getImageList можете попытаться вывести данные с его помощью. Документацию по данному сниппету можете найти здесь. Либо сделать свой сниппет (parseMIGXToGallery), который я использую для генерации разметки из &tpl чанка, базируясь на ТВ данных:
Давайте пройдём каждую строчку:
- Берём переменную $input (которая берёт данные содержащиеся в параметре &input в вызове сниппета, об этом немного позднее) и парсит JSON в пхп-массив.
- Мы установим пустой массив для хранения нашего вывода.
- Убедимся, что переменная $input variable не NULL или Ложь, что бы значило, что JSON не передан или что он неправильный, а также проверим $tpl переменную (переданную параметром &tpl в вызове сниппета) не пуста ли она. Если какое либо условие Истина мы выведем сообщение об ошибке "пусто', что послужит подсказкой для контент-менеджера, что что-то неправильно.
- Далее проход через каждый элемент массива $input как $row.
- Проверяем установлена ли переменная $set (которая устанавливается в вызове сниппета в параметре &set) и если она не пуста мы сверяем её значение со значением "set" текущего ряда. Если это не то, что нужно переходим к следующему элементу массива.
- Получаем чанк с именем $tpl и вставляем значения текущего ряда в него в виде заполнителей (плейсхолдеров).
- Закрываем цикл foreach.
- Наконец склеиваем вместе массив $output, отделяя каждый элемент разрывом строки и выводим его на страницу.
- Итак суммируя вышесказанное мы берём введенные данные, проходим по каждому ряду и проверяем принадлежат ли они к набору, что мы определили, далее это получает чанк и складывается всё в вывод.
- Запуск сниппета
Всё, что нам нужно – это сниппет вызов, где нам нужны наши изображения и чанк, который выведет всё в нужном виде для FlexSlider. Вот как вызывается сниппет:
И чанк images.gallery.tpl:
Также нужно обернуть весь вывод сниппета в div и неупорядоченный список, согластно документации FlexSlider. Чтобы сделать это всё проще – положим всё это в один чанк. Мой чанк называется slider и содержит следующее:
Используя данный чанк я могу просто ссылаться на что-либо в контенте, что намного легче запомнить или занести в шпаргалку.
Теперь можно приступить к разметке слайдера FlexSlider
Шаг 3: Использование FlexSlider
FlexSlider относительно лёгок в использовании (загрузите его файлы здесь) и есть куча примеров на его сайте. Также вам нужно включить вызов jQuery на странице и его CSS файл (запакован в zip файл) и FlexSlider плагин (также находится в архиве zip). После этого вам нужно инициировать правильный элемент используя следующий код:
На сайте советуют поместить всё в head файла, но я лично размещаю всё это внизу. Если ваш слайдер выводится наверху страницы, то тогда лучше поместить его в <head>, чтобы он загружался перед появлением страницы, поэтому размещайте где вам угодно.
Вот и всё! Надеюсь эта длинная статья поможет кому-то начать использовать MIGX и такие слайдеры как FlexSlider!
При создании урока использовались материалы блога Марка Хамстры статья How to: Managing Galleries with MIGX
Jul 09 2012 MIGx слайдер Виктор Матушевский
Bezumkin
10.07.2012 04:32Лично я использую вместо MIGX - BannerX. Он прекрасно выводит слайды в чанке, настраивается лимит, сортировка, группировка слайдов (рекламное место), ссылка при клике.
Удобный (хотя надо бы еще допилить) интерфейс, никакого JSON.
Так что, кому не нужен уникальный слайдер на каждую страницу - посмотрите в эту сторону. Для FlexSlider разницы не будет, откуда слайдеры листать.
Viktor Minator
10.07.2012 10:14Дойдёт очередь и до BannerX =)
Владимир Ребров
10.07.2012 17:23На php 5.2 все ок.
На php 5.3 ругается на deprecated-функции, но работает.
На php 5.4 получаю fatal error:
Fatal error: Call-time pass-by-reference has been removed in C:\webserver\domains\revo\core\components\migx\model\migx\migx.class.php on line 104
Viktor Minator
11.07.2012 11:27Запишите сюда https://github.com/Bruno17/MIGX/issues вашу проблему.
Владимир Ребров
19.07.2012 10:25Так и сделал. Уже пофиксили.
Ablialim Saliev
12.07.2012 10:30Замечательная штука MIGX, делаю первый проект на Revo и хотя еще не со всеми тонкостями разобрался, однозначно MIGX очень радует.
Интересует несколько моментов в Вашем примере:
1. Судя по всему ту не предусмотрена возможность редактирования? Или я ее просто не увидел?
2. Как я понял вывод изображений привязан к значению set? А можно ли привязать его к id документа например?
Viktor Minator
12.07.2012 11:201. Правой кнопкой по ряду с данными и "Редактировать".
2. Можно к любому значению.
Rasul A
04.08.2012 19:04Немного оффтоп, почему в коде используют разделителями точки, images.gallery.tpl и т.п.? у Безумкин кстати тоже, почему не camelCase, который вроде как стандарт в модекс?
Viktor Minator
04.08.2012 19:07можно с точками, а можно и без. С точками удобнее потом в редакторе выделять мышкой и визуально лучше воспринимается.
Вячеслав Скотч
26.08.2012 20:17Спасибо вам за хороший пример. Все сделал, получилось. Не подскажите, возможно ли добавлять изображения не через админку вручную, а чтобы пользователи сайта могли загружать свои изображения, они бы подхватывались MIGX, и каждое загруженное изображение крутилось бы в слайдере вместе со всеми остальными, скажем 5 минут. Такое вообще возможно?
Бхакти Лата
24.10.2012 21:30В слайдере больше всего понравилась книга Боба Рэя. Очень жалко, что в Россию эту книгу Amazon.com не высылает.
Max
29.10.2012 09:44Здравствуйте, разбираюсь с MIGX такая задача, нужно в MIGX вызвать MIGX. Я создаю tv с параметрами ввода MIGX все вроде работает, но как только доходит до того как вывести фото вложенного MIGX начинаются проблемы. Фото не выводятся. Подскажите это вообще можно сделать? Спасибо
Viktor Minator
29.10.2012 13:59Без просмотра кода тут сказать что-то сложно. Картинки могут не выводиться по разным причинам.
Max
30.10.2012 04:43Я постараюсь понятнее объяснить. создал я TV с методом вывода migx назвал его face, назначит нужный шаблон. Все в дополнительных полях появилось. Теперь задача стоит в том чтобы в этот уже созданный migx tv вставить другой migx. Опять иду создаю TV с методом вывода migx обзываю его face2. Иду в tv face добавляю там {"field":"face2","caption":"Фото","inputTV":"face2"}. сохраняюсь. Захожу снова на страницу открываю доп. поля, о чудо в первом face migx появился вложенный face2 migx. Он даже работает. Теперь хочу вывести. иду в шаблон вставляю [[getImageList? &tvname=`face` &tpl=`facadeTpl` ]] теперь мне нужно в шаблоне facadeTpl вывести вложенный face2 migx. вставляю в facadeTpl [[getImageList? &tvname=`face2` &tpl=`facadeTpl2` ]] и ничего не происходит, пусто. убираю параметр &tpl=`facadeTpl2` все выводится но без шаблона. Выводится то что вы приводили в вашем уроке [{
"MIGX_id":"1","set":"set1","description":"кошка Марка, которая когда не спит, тайком ворует колбасу и ест","image":"demo/uroki/15/1.jpg"
}. Подскажите может как то по другому нужно выводить вложенный migx? Еще раз спасибо.
Дмитрий Христоев
30.11.2012 11:20Здравствуйте! А почему при установке пакета MIGX всегда появляется ошибка. Например
[2012-11-30 11:16:11] (ERROR @ /index.php) Error 42S02 executing statement:
[2012-11-30 11:16:10] (ERROR @ /index.php) Error 42S02 executing statement:
Array (
[0] => 42S02
[1] => 1146
[2] => Table 'pallad_cinema.modx_migx_configs' doesn't exist
)
Это не первый сайт, ошибка везде, но решение найти не могу, спасибо!
Clean
08.01.2013 16:55Дмитрий, проблема в том, что Вы не произвели установку конфигурационного набора для MigX , сделать это нужно по мануалу
http://rtfm.modx.com/display/ADDON/MIGX#MIGX-Step2%3ASetuptheMIGXConfiguratorCustomManagerPage%28CMP%29andPackageManager
Виктор Мартинович
14.01.2013 17:35Здравствуйте, а подскажите почему поле image у меня просто текстовое, т.е. путь к картинке нужно вносить в ручную?
Viktor Minator
14.01.2013 17:38предварительно нужно создать все ТВ, которые будете использовать в MIGx ТВшке, а именно 3 переменных шаблона, для изображения (Тип ввода: Изображение, Тип вывода: текст).
Виктор Мартинович
14.01.2013 17:53спасибо за быстрый ответ)
Павел Сон
11.03.2014 20:40Простите, пожалуйста, но можно ли чуть поподробнее расписать то, что мне необходимо сделать для того, чтобы в поле images можно было бы подставлять изображения с помощью селектора и как потом привязать это к основному TV?
Виктор Мартинович
14.01.2013 17:57И еще, я к примеру использую Mgix-tv на шаблоне Home, в ней 3 поля(title, intro, image),
Нужно создать 3 TV соответственно title, intro, image, а шаблон для них тоже Home или можно даже не проставлять?
Viktor Minator
14.01.2013 19:57можно не проставлять
Дима
12.03.2013 01:323 шаг мне непонятен, как включить вызов JQ и его CSS? Может я конечно что-то не понял, но разобраться не могу
Дима
12.03.2013 03:55Вроде под разобрался, теперь появляется окно слайдера, но он просто белое, посмотрел код, вот что он мне показывает
в чем я ошибся?
Дима
12.03.2013 03:56div class="flexslider">
ul class="slides">
/ul>
/div>
Дмитрий Иванов
20.05.2013 13:48У меня такая проблема:
Установил MIGx. Сделал всё по инструкции: http://rtfm.modx.com/display/ADDON/MIGX#MIGX-Step2%3ASetuptheMIGXConfiguratorCustomManagerPage%28CMP%29andPackageManager
Когда захожу в "Компоненты" -> "MIGx", сверху экрана выводятся ошибки:
Notice: Undefined variable: packageName in G:\xampp 1.8.2\xampp\htdocs\my_site\core\components\migx\model\migx\migx.class.php on line 299
Notice: Undefined variable: packageName in G:\xampp 1.8.2\xampp\htdocs\my_site\core\components\migx\model\migx\migx.class.php on line 299
Notice: Undefined variable: packageName in G:\xampp 1.8.2\xampp\htdocs\my_site\core\components\migx\model\migx\migx.class.php on line 299
Notice: Undefined variable: packageName in G:\xampp 1.8.2\xampp\htdocs\my_site\core\components\migx\model\migx\migx.class.php on line 299
Notice: Undefined variable: packageName in G:\xampp 1.8.2\xampp\htdocs\my_site\core\components\migx\model\migx\migx.class.php on line 299
Notice: Undefined variable: packageName in G:\xampp 1.8.2\xampp\htdocs\my_site\core\components\migx\model\migx\migx.class.php on line 299
Не могу понять как от них избавиться.
Версия MODx - MODX Revolution 2.2.7-pl (traditional)
Версия MIGX - 2.4.2
Сервер - XAMPP 1.8.2
Дмитрий Иванов
20.05.2013 14:28После установки MIGX в логах нет ошибок. После установки настроек в "Система" ->"Действия" тоже. После входа в "Компоненты"->"MIGX" в логе появляются ошибки:
[2013-05-20 13:25:26] (ERROR @ /my_site/manager/index.php) Error 42S02 executing statement:
Array
(
[0] => 42S02
[1] => 1146
[2] => Table 'my_site.modx_migx_configs' doesn't exist
)
И изменения в разделе "Действия" не сохраняются. Может надо создать таблицу "modx_migx_configs'"? Но с какими полями тогда создавать?
Дмитрий Иванов
20.05.2013 14:35В "Компоненты" -> "MIGX" нажал на кнопку "Setup" и таблица создалась. Но всё равно настройки не сохраняются.
После нажатия на разные другие кнопки типа "Create table" в логах появились ошибки:
[2013-05-20 13:32:00] (ERROR @ /my_site/assets/components/migx/connector.php) addPackage called with an invalid package name.
[2013-05-20 13:32:00] (ERROR @ /my_site/assets/components/migx/connector.php) Could not find specified XML schema file G:/xampp 1.8.2/xampp/htdocs/babymart/core/components//model/schema/.mysql.schema.xml
[2013-05-20 13:32:01] (ERROR @ /my_site/assets/components/migx/connector.php) Could not find specified XML schema file G:/xampp 1.8.2/xampp/htdocs/my_site/core/components//model/schema/.mysql.schema.xml
Viktor Minator
20.05.2013 14:46какие-то непонятные ошибки, попробуйте использовать всё-таки опенсервер или выделенный хостинг (тогда хоть можно зайти посмотреть что к чему)
Дмитрий Иванов
20.05.2013 15:44Да, действительно дело было в сервере. Поставил OpenServer и никаких ошибок. Чёртов XAMPP, придётся перелазить на OpenServer, спасибо!
P.S.: Хотя, конечно, хотелось бы понять чего там этому серверу не хватало...:(
Дмитрий Иванов
20.05.2013 16:30Поковырял.
Выходит, что в файле site_name\core\components\migx\model\migx\migx.class.php на 299 строке пустая переменная (ну это понятно из сообщения ошибки, конечно) и XAMPP ругается на не объявленную переменную, а OpenServer нет.
Там в цикле эксплодится переменная $config:
foreach ($configs as $config) {
$parts = explode(':', $config);
...
// Значения переменной: packagemanager, packagemanager, migxconfigs, migxconfigs, setup, setup.
И дальше идёт условие, которое, получается, всегда не выполняется:
if (isset($parts[1])) {...
Но на else стоит какое-то малопонятное для меня условие которое тоже не выполняется:
...} elseif ($cfObject = $this->modx->getObject('migxConfig', array('name' => $config, 'deleted' => '0'))) {...
Получается, что ни одно из условий не выполняется, а внутри условия объявляется переменная $packageName и она всегда пустая. Интересно, это ошибка разработчика или так и задумано...
Monti
02.10.2013 14:45У меня вот так http://ipic.su/a7v9y.jpg (
Юрий
24.12.2013 15:29Добрый день, как мне добавить чекбокс который добавлял к фотографии класс ?
Антон Букреев
07.01.2014 09:38Добрый день! Подскажите как можно вывести форматированный текст из description?
Сделал InputTV с текстовым редактором соответствующий. Ввожу через текстовый редактор, но на выходе получаю просто текст.
Viktor Matushevskyi
07.01.2014 14:52description - уже зарезервированное поле, вам нужно назвать по-другому
Евгений Вершинин
02.06.2014 17:27Маленькое добавление на MIGX 2.6.8. Если выводить "inputTV":"image", то выводится обычное текстовое поле, что очень не удобно для ввода. А вот если поменять на "inputTVtype":"image", то будет выводиться нормальный диалог выбора изображения. :) А всего-то нужно было мне глянуть доку на http://rtfm.modx.com/extras/revo/migx/migx.backend-usage
Олег
09.10.2014 09:58Админ в установке разметки колонок измени inputTV на inputTVtype тогда можно выводить изображения через стандартный сниппет getimagelist.
upd:оказывается уже был такой совет. Поддерживаю.