Modx migx: MODX – MIGX | ИТ Шеф – MIGX — MIGX | MODX Docs

Начинаем работать с MIGX или для чего это нужно / Компоненты / Modx Revolution / Технический блог веб-разработчика

Начинаем работать с MIGX или для чего это нужно

Данный компонент в своей работе использую довольно-таки часто, а в некоторых ситуациях он оказывается просто незаменимым. Его очень удобно использовать в том случае, когда нужно создать TV-поле, в которое впоследствии можно будет добавлять данные, схожие по своей структуре несколько раз. Сама же структура создаётся за счёт создания своих внутренних полей, которые на самом деле являются ни чем иным, как строкой формата JSON. 

Где это применяется?

На самом деле, данному компоненту можно найти множество применений, в зависимости от того, какую задачу вам необходимо решить. В качестве примера мы рассмотрим такую типовую задачу, как создание галереи. Первое что приходит на ум обычно  — создать несколько полей типа «Изображение». И вроде бы проблемы в этом никакой нет, кроме одной — мы не знаем, сколько именно у нас изображений будет в нашей галерее. Можно конечно привязать к шаблону несколько TV одного и того же типа, но выглядеть это будет избыточно с точки зрения захламления лишними сущностями, которых в одном ресурсе будет скажем 20 и они будут все использоваться, а в другом — будут те же 20 полей, но при этом по факту будет использоваться лишь 5 из них. Ну и плюс в нагрузку к этому все прочие вытекающие отсюда неудобства. 

Вот здесь и приходит к нам на помощь компонент MIGX. Кстати, ближайший аналог по данному функционалу в Evo, является MultiTV, поэтому если вы уже когда-то работали с ним, то понять работу MIGX вам не составит никакого труда. Но даже если вы сейчас не до конца понимаете, для чего всё это нужно, то далее по тексту все вопросы отпадут сами собой. 

Забегая вперёд, хочу сказать что целью данной статьи было не охватить все возможности компонента (а их действительно великое множество и в рамках одной статьи охватить всё было бы сложновато), но описать основной функционал, взяв который за основу, можно будет в дальнейшем изучать и другие возможности компонента. 

Настройка конфигурации MIGX

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

Приложения«).

Затем отправляемся во вкладку MIGX и нажимаем на кнопку «Добавить элемент». На вкладке «Settings» вводим имя для нашей конфигурации, пусть это будет gallery. После чего выбираем вкладку Formtabs и нажимаем на кнопку «Добавить элемент» уже в ней. Здесь поле «Caption» отвечает за название вкладки, в которой у нас будут отображаться все поля. Но сама вкладка при этом отображается только в том случае, если создано 2 или более вкладки. 

Теперь нужно определить, сколько у нас вообще будет полей у каждого элемента галереи. Я решил что у меня будет 2 поля — «Название изображения» и «Изображение». Нажимаем «Добавить элемент».

Заполняем необходимые поля:
fieldname — image (должно быть уникальным), 
caption — «Картинка» (подсказка для пользователя).

Input Tv type — тип tv поля. Поскольку это картинка, то в данном случае нужно указать «image«. Но по факту, можно использовать и другие типы полей, в зависимости от того, какой результат вы хотите в итоге получить: 

  • textarea — текстовая область, 
  • richtext — текстовый редактор, 
  • listbox — список (одиночный выбор), 
  • listbox-multiple — список (множественный выбор), 
  • option — переключатели (radio), 
  • checkbox — флажки (checkbox), 
  • file — файл, 
  • url — url, 
  • email — электронная почта, 
  • number — число,
  • date — дата, 
  • tag — тег.

После того, как все поля заполнены, нажимаем «Выполнить».

Точно так же, по образу и подобию создаём поле для названия изображения. Поля fieldname и caption задаём произвольно, а вот в поле Input Tv type указываем тип — «text». 

После того, как были заполнены значения для всех полей, нажимаем «Выполнено». С вкладкой Formtabs (создание и редактирование элемента в админке) мы разобрались. 

Теперь нужно будет разобраться с колонками, которые показываются при отображении всех элементов. 

Переходим во вкладку «Columns» и нажимаем кнопку «Добавить элемент». 

Для поля «Изображение» вводим такие данные: 
Header — «Изображение» (заголовок колонки)
Field — image (должно совпадать со значением поля fieldname из вкладки Formtabs). Это нужно для того, чтобы сопоставить колонку с отображаемым полем. 

Здесь же, переходим во вкладку «Renderer» и в выпадающем списке «Renderer» выбираем опцию — this.renderImage. Сейчас я не буду вдаваться в детали, скажу лишь что это необходимо для того, чтобы при добавлении картинки, у нас в админке отображалась сама картинка, а не путь к ней. Сохраняем и переходим к следующей колонке — заполняем по аналогии, только на этот раз, за отсутствием необходимости, не заходим во вкладку Renderer.

Подтверждаем изменения, нажав кнопку «Выполнено». Всё, мы создали нашу конфигурацию, дальше будет проще. 

Привязываем конфигурацию к обычному TV полю 

Создаём TV как обычно, только на этот раз в настройках на вкладке «Параметры ввода» указываем в качестве типа ввода — migx. А в поле «Конфигурации» указываем название нашей конфигурации. В моём случае, это gallery. 

Выводим данные migx поля

[­[!getImageList?
&tpl=`gal_item`
&tvname=`gallery_inner`
&docid=`1`
]]

tpl

— это название чанка, шаблон для вывода изображения;

Пример чанка: 

<li><img src="[­[+image]]" alt="[­[+image_caption]]"></li>

tvname — как следует из названия, это само поле, которое связано с конфигурацией migx;
docid — ID документа, значение TV которого будем выводить. 

Обучение основам MIGX MODX Revolution. MIGX создание фотогалереи

Вашим клиентам постоянно нужно пространство для добавления фото и их описаний в фотогалерее, нужно создавать перечни служебной контактной информации, требуется область для загрузки pdf, куда администратор мог бы загружать списки pdf файлов?
MIGX поможет сделать это все, и даже больше. Он предоставляет MODX ресурсам возможность быть использованными в качестве контейнеров данных, по типам. Он позволяет обычной MODX Template Variable (TV, Шаблонная переменная) быть контейнером для других Template Variables (Шаблонных переменных) или произвольных входных данных в форме строковой JSON. Визуально это выглядит как координатная сетка, выводящая администратору список ячеек данных. Администратор может создавать, редактировать и удалять записи, изменять порядок отображения, перемещая записи вверх-вниз, используя AJAX. Все это было придумано Бруно Пернер (Bruno Perner).

 
В моем короткой обучалке я создам шаблонную переменную (Template Variable, TV) MIGX, которая позволит администратору контролировать область загрузки Pdf-файлов на сайте. Этот достаточно простой пример продемонстрирует (я надеюсь) основные принципы работы с данным приложением. Итак, начнем.
 
Замысел: На нашей главной странице мы хотим иметь box, в котором будут отображаться Pdf-файлы наших клиентов в виде ссылки для загрузки. Это могут быть официальные документы, или подробная информация о продукте, или что-то еще.
 
Первое,  что мы должны сделать, так это обратиться к package manager и установить MIGX. Сделано? Замечательно!
Теперь нужно создать нашу Template Variable, которую мы будем использовать для хранения MIGX JSON. Я обычно называю ее “pdf.migx”. 
Традиционно даю ссылку на документацию (RTFM):
http://www.modx.cc/documentation/additions/migx/

 


Шаг 1: Установка нашего MIGX TV


Итак, мы уже назвали нашу шаблонную переменную TV “pdf.migx”. Теперь перейдем на вкладку “Input Options” и выберем входной тип “migx”. Благодяря этому станут доступны некоторые специальные конфигурационные опции. Для нас важны две из них: “Form Tabs” и “Grid Columns”. Здесь мы перейдем к формированию интерфейса координатной сетки, которую администратор будет использовать для нашего ресурса.
Form Tabs: Здесь мы зададим то, какие переменные администратор сможет сохранять и какой текст мы будем использовать для меток в этой форме.  В виде JSON  строки.
Вот что вы можете вставить в область:
 
<code>[ {"caption":"Title", "fields": [ {"field":"title","caption":"Title"} ]}, {"caption":"PDF", "fields":[ {"field":"pdf","caption":"PDF file","inputTV":"download.pdf"} ]} ] </code>
 
Это создаст 2 вкладки в нашем интерфейсе. Первая называется “Title”. Этот текст будет использоваться в качестве ссылки, ведущей на данную вкладку в клиентском интерфейсе. Вторая называется “PDF”. Сюда администратор сможет загружать pdf. Вы могли бы иметь оба “входа” информации на одной вкладке, но я хотел продемонстрировать, каким образом MIGX автоматически создает вкладки. Вам нужно задать имя в первом поле “caption”. Ниже caption есть другое свойство, названное “fields”. Здесь вы можете задать, какие переменные может вводить администратор. В первом случае мы имеем только одну входную переменную названную “Title”. Вы зададите имя поля позже, когда у вас будет доступ из клиентской части. Теперь задайте caption, а затем задайте, где будет храниться наша шаблонная переменная Template Variable. Т.к. title – это всего лишь текстовая запись, вам не нужно задавать ее свойства, оставьте все по умолчанию. Вам также не нужно создавать отдельную TV для данной переменной, т.к. это будет сохранено в строке JSON.
Вторая область для входных данных (или вкладка) называется “PDF”. Caption – обычный текст, который будет выводиться в интерфейсе администратора. Поле, используемое в шаблоне для клиентской части интерфейса, называется “pdf”, и поэтому caption будет содержать “PDF file”. В нашем случае мы хотим, чтобы администратор мог загрузить pdf файл в медиа браузер MODX, поэтому нам нужно назначить для этого Template Variable / Шаблонную переменную. Мы назовем данную TV “download.pdf”. “inputTV” – параметр, который  мы связываем с именем TV.
 
После того, как это сделано, нам нужно сформировать первоначальную координатную сетку, которую будет видеть администратор.
 
В данном случае мне нужно только одно поле для отображения на координатной сетке – title pdf. Если у нас есть изображение, то нам может потребоваться две колонки (Title, Image). Обучающие материалы, как сделать галерею на базе MIGX, можно посмотреть по ссылке:http://www.modx.cc/documentation/additions/migx/
 
Просто вставьте это в секцию “Grid Column”:
 
<code>[ {"header": "Title", "width": "160", "sortable": "true", "dataIndex": "title"} ]</code>
 
Это дает нам таблицу, состоящую из одной колонки, с заголовком “Title”.  Вы можете задать ширину колонки, или позволить администратору сортировать колонки и т.д.
 
Последний шаг – ассоциировать данную TV с шаблоном, который мы будем использовать. В моем проекте я позволяю администратору редактировать эту информацию, потому что эта область будет отображаться на главной странице.
 

Шаг 2:  Задаем pdf Template Variable / Шаблонную переменную


Для любого, уже знакомого с MODX, этой фразы было бы достаточно. Создайте новую TV, названную “pdf.download”, точно так же, как в предыдущем шаге. Наш входной тип в этом случае — “file” и мы можем ассоциировать с ним те медиа ресурсы, которые хотим. Единственное, что отличается, так это то, что мы НЕ связываем TV с шаблоном / template. Доступ к данной TV осуществляется только через MIGX.
 

Шаг 3:  Как этим все пользоваться?


Теперь перейдите к ресурсу, который ассоциирован с шаблоном, который ассоциирован с нашей MIGX TV. Все понятно?  Возможно, вы ассоциировали нашу MIGX TV с категорией “PDF Download”. Теперь поищите нашу TV под этой категорией. Или, может быть, вы не ассоциировали TV с категорией, и попробуйте поискать в категории “uncategorized”.   Теперь вы должны увидеть начало координатной сетки. Вы видите кнопку “Add item” и заголовок “Title”. Для того, чтобы добавить запись – кликните по “Add item”. Здесь вы вводите наш title для ссылки, откуда следует загружать, а также ссылку на pdf файл. Поэтому, возможно, придется создать несколько записей. Попробуйте поперемещать записи вверх-вниз, изменяя их порядок на координатной сетке. Здорово? Я люблю этот addon!
 

Шаг 4:  Переходим в клиентскую часть


Мы закончили производить все настройки в служебной области. Ваш администратор может загружать такие pdf файлы, какие захочет, и задавать для каждого title. Замечательно. Теперь нужно запустить сниппет, который поставляется в комплекте с MIGX, это нужно для обеспечения доступа к нашим данным.
 
Разместим box внутри чанка. В чанке должен быть следующий код:
 
<code>[ [getImageList? &tvname=`pdf.migx` &tpl=`downloadTpl` &docid=`1`] ]</code>
Сниппет, который мы используем, называется “getImageList. Он обладает множеством свойств, узнать поподробнее о которых вы сможете, перейдя по ссылке:
 
http://www.modx.cc/documentation/additions/migx/
 
Для нас самыми важными свойствами являются “tvname” and “tpl”.  Если вы хотите использовать этот чанк на других страницах, вам нужно ассоциировать ID ресурса, содержащего данные. Это производится с помощью свойства “docid”. Я использую ID 1, т.к. это выполняется на главной странице. Если box будет отображаться только на странице, на которой находится MIGX TV (для главной страницы ID=1), то это свойство может быть удалено. Второе свойство, которое может представлять интерес для нас, это “limit” или “&limit=´5´” (для примера). Это свойство ограничивает выходные данные первыми 5 на координатной сетке.
 
Вы наверно, обратили внимание, что я сослался на шаблонный чанк  “downloadTpl”. Этот чанк используется для организации выходного цикла.
 
Вот код для чанка:
 
<code><p><a href="[[+pdf]]" target="_blank">[[+title]]</a></p></code>
 
Вы можете выводить элементы чанка в виде неупорядоченного списка, если хотите. Я просто использовал простейший тэг параграфа. На что вы должны обратить внимание, так это на то, что вы используете плейсхолдер и . Это в точности такие же имена, которые мы ассоциировали со свойствами нашего поля данных в шаге 1.
Теперь наш вызываемый сниппет имеет доступ к нашей 
MIGX TV, получает JSON string, считывает данные с помощью его, и формирует чанк для каждого отдельного случая.
 
Вот так оно и должно работать. Теперь вам нужно написать CSS и сделать так, что бы все это выглядело красиво.
 

Заключение

С помощью этой обучалки вы познакомились с базовыми принципами, лежащими в основе 
MIGX. Я использую MIGX в каждом проекте и испытываю восхищение перед его мощью и гибкостью. Если у вас появились какие-либо вопросы или вы нашли ошибки в моем тексте – пожалуйста, оставьте соответствующий комментарий.
 
Я обнаружил одно ограничение в MIGX – когда использовал входной TV тип “Rich Text” для одной из входных переменных. Т.к. TinyMCE достаточно “тяжел” дляjavascript, иногда возникают проблемы с сохранением данных.
 
 

программирование не стандартного функционала сайта или MIGX во всем его дьявольском великолепии

Использование латиницы, позволит избежать ошибок, при использовании компонентов, работающих с дополнительными полями, называемых в modx Template Variables (TV) — переменные шаблона. Для начала, преобразуй основные элементы, вот как:

  • Дополнительные поля
    • Галерея
      • шаблон.3.галерея → tpl.3.gallery
    • Главная
      • шаблон.1.слайдер → tpl.1.slider
  • Чанки
    • Шаблоны
      • шаблон.1 → tpl.1
      • шаблон.2 → tpl.2
      • шаблон.3 → tpl.3
      • шаблон.4 → tpl.4
      • шаблон.4.CollectionContainer → tpl.4.CollectionContainer
      • шаблон.4.modDocument → tpl.4.modDocument
      • шаблон.5 → tpl.5
    • Элементы
      • Изображения
        • изображение → img
        • шаблон.1.слайдер.слайд → tpl.1.slider.slide
        • шаблон.3.галерея.фото → tpl.3.gallery.photo
      • шаблон.4.CollectionContainer.статья → tpl.4.CollectionContainer.article
Властвуй над латиницей

Судя по всему — названия элементов, видать-именовать вольно аж на китайском и даже на балабольском! Вероятно, это каким-то таинственным образом, связано с совершенной архитектурой веб-приложения для разработки высокопрофессиональных сайтов modX, хотя, не думай об этом.

можно делать хоть на китайском

Однако, корректно работать с любыми компонентами — будет именно латиница. И все же когда, пред тобой мелькнет задача с поиском и заменой названий: ты будешь знать как сообразить это сверх-стремительно и пластично; гляди — названия элементов ты отрегулировал, сейчас — нужно поменять имена в шаблонах и чанках сайта (для того, чтобы все сниппеты верно работали и сайт корректно собирался). На тестовом сайте там чуток кода, а случаются сайты — где элементов, да сниппетов немалое множество. Так вот: скачай и установи компонент modDevTools. Начни замену с чанков:

  • $изображение → $img
  • шаблон.1.слайдер.слайд → tpl.1.slider.slide
  • шаблон.3.галерея.фото → tpl.3.gallery.photo
  • шаблон.4.CollectionContainer.статья → tpl.4.CollectionContainer.article

Дополнительные поля (TV):

  • шаблон.3.галерея → tpl.3.gallery
  • шаблон.1.слайдер → tpl.1.slider

Основной шаблон:

moddevtools

Для каверзных, новых элементов сайта — пускай в дело гугловский он-лайн переводчик, и, заодно обогатишь свой словарь английского. Вне всякого сомнения, имена элементов, надо надеяться — не будут сляпаны на транслите, правда да, оно верно, тутmoddevtools уж поступай как заблагорассудилось здесь и сейчас. Главное — помни о поле описание, чтобы при нацеливании мышки всплывала подсказка, с наиболее полезной информацией об элементе.

Скопируй содержимое файла /assets/tpl/base.tpl в новый чанк tpl (сокращение от template), категория Шаблоны. Пробегись по шаблонам сайта, где используется статический файл, убери соответствующую галочку и замени код шаблона на: [[$tpl]]

Перенеси основной шаблон сайта в чанк

В предыдущих публикациях, я уже рассматривал простенькую конфигурацию, для загрузки картинок в ресурс, но воистину, это лишь малая часть возможностей MIGX — на деле, функционал, которым обладает этот компонент — дает головокружительную свободу для программирования абсолютно любого сайта, с невероятными: даже самыми бешенными задумками, MIGX нещадно справляется, не оставляя компромиссов любой иной системе управления, при этом сохраняя простоту, изящность и удобство добавления информации на сайт; освоив этот компонент, ты будешь в восторге от того, как чудовищно просто создаются модули, как элементарно, например, разрабатывается управление лендинг пейджем, корпоративным и любым другим сайтом, вне зависимости от его масштаба да функционала; и вот, в сверкающем блеске MIGX, ты, наконец-то обретешь покой, и, вероятно, придет понимание того — сколь скудны, приземлены и как меркнут тысячи, триллионы строк кода альтернативных систем управления, фреймворков, и прочих, прочих: преклоняясь пред гениальностью MIGX и modx revolution, программы богов; сейчас, остынь слегка, будет сложно, экстремально сложно, но оно того стоит! (на самом деле очень легко, но ты бот, принимай все как сказано и увидено, сложно — значит сложно — слуга ты царя небесного, смирись)

Чем же так хорош MIGX?

Очевидно что, ни одной статьи не хватит, изложить то, как может быть полезен MIGX при создании сайта, и здесь, я постараюсь поведать хотя бы малую часть того, что взорвет твой шаблон и представление о разработке сайтов, и, приведу ссылки других статей, которые, помогут дать тебе пинка к дальнейшему развитию. Ты трезвая?

MIGX — это тип дополнительного поля, для объединения нескольких дополнительных полей в одном поле. Это объединение: значительно упрощает рабочий процесс для итоговых пользователей — менеджеров, дабы они смогли добавлять сложные элементы данных на сайт, с присущей modx грацией. Элемент данных может состоять из любого количества любых других дополнительных полей: в том числе текст, изображения, файлы, флажки и так далее…

Реально очаровывает то, что в качестве дополнительного поля, может быть использовано другое поле MIGX, с безграничной степенью вложенности… это кайфовое балансирование: на гранях безумия и гениальности — телепортирует твое сознание на новый уровень бытия, будь уверен!

Ты самостоятельно ознакомишься с документацией, и, разумеется повторишь все туториалы на тестовом сайте. Не останавливайся на достигнутом, и изучай MIGXdb, воспроизведи все туториалы самостоятельно. По MIGXdb — советую урок Пана Евгениуса.

Только выполняя обучающие уроки, ты сможешь творить чудеса, с помощью этого компонента — не пытайся понять его за раз: делай, изучай, читай, делай, мысли шире, в modx revolution и MIGX возможно все. Ах, этот сакральный грааль MIGX на modx revolution, компонент выше бесконечного восхищения и всяческих похвал…

На этой странице, по плану, размещение: крутящегося во все стороны слайдера и блока с преимуществами компании. В прошлом, уже рассматривалось создание дополнительного поля слайдера, но теперь сделай это поле иным способом, более простым.

Элементы → Дополнительные поля → Главная → tpl.1.slider

Правой кнопкой мыши, не спеши, счёлкни по элементу и выбери пункт Редактировать. Перейди на вкладку дополнительного поля Параметры ввода, ликвидируй значение Конфигурации: resourcealbum, а в следующую строку Вкладки формы, копируй этот кусочек кода:


[
{"caption":"Слайдер", "fields": [
  {
    "field":"alt",
    "caption":"alt"
  },
  {
    "field":"title",
    "caption":"title"
  },
  {
    "field":"image",
    "caption":"Изображение",
    "inputTVtype":"image",
    "sourceFrom":"migx"
  }
]}
]

Строка 15 «sourceFrom»:»migx», означает что: источник файлов для изображения будет подхватываться из настроек TV-поля (вкладка Источники файлов), а там необходимо выбрать источник: Слайдер.

В следующее поле, Разметка колонок, копируй:


[
  {"header": "Изображение", "width": "160", "sortable": "false", "dataIndex": "image","renderer": "this.renderImage"},
  {"header": "alt", "sortable": "true", "dataIndex": "alt"},
  {"header": "title", "sortable": "true", "dataIndex": "title"}
]
Главная страница: слайдер

Отличается этот способ от предыдущего тем, что у дополнительного поля слайдера теперь нет общей кнопки Загрузить файлы и Импорт из файловой системы, и файлы к каждому новому слайду загружаются вручную — в открывающемся окошке MIGX. В отличии от предыдущего метода, теперь можно дублировать одни и те же картинки. И такой «грубой» и безчувственной конфигурацией json — легче расширять простые массивы данных, например, можно создать для каждого слайда заголовок; этот код:


  {
    "field":"caption",
    "caption":"Заголовок"
  },

Добавь после поля title, Вкладки формы — и в результате, у каждого слайда появится на одно вводимое поле больше, сейчас добавится поле Заголовок. Чтобы поле отображалось в сетке, добавь следующую строчку на вкладку Разметка колонок, после строки с Изображением:


  {"header": "Заголовок", "sortable": "true", "dataIndex": "caption"},

Зафиксируй вывод этой новой строки на сайте, редактируй чанк: Элементы → Изображения → tpl.1.slider.slide (добавь строку 2):


<div>
  <div>[[+caption]]</div>
[[$img?
  &imgThumb=`[[+image:phpthumbon=`&h=540&zc=0`]]`
  &alt=`[[+alt]]`
  &title=`[[+title]]`
]]
</div>
Главная страница: слайдерГлавная страница: слайдер

В прошлом методе — работала конфигурация, которая редактируется посложней, в визуальном редакторе ПриложенияMIGX, вкладка MIGX (она, кстати, продолжает работать на галерах и сейчас для галереи). Там, конечно, возможностей намного больше, но для начала разберись с json конфигурацией, так как для простых дополнительных полей этот способ позволит быстро их создавать и удобно расширять же. Кхмм? Читай дальше баран!

Допустим, этот блок будет выглядеть так: картинка или иконка визуализирующая текущее преимущество, заголовок, текст описание и ссылка на страницу с подробным описанием. На моем тестовом сайте, я не рассматриваю css и js код, так как это тебя только запутает, при необходимости — сделаешь его сам. А для того, чтобы в голове у тебя что-то отложилось, я оперирую чистым html-кодом.

Вот пример, каким может быть этот блок, если оформить его подобающим образом:

Блок с преимуществами компании

Создай новый источник файлов для хранилища иконок. Ступай к МедиаИсточники файлов, скопируй источник Filesystem, отредактируй его:

  • Имя: Хранилище иконок
  • basePath: assets/files/icons/
  • baseUrl: assets/files/icons/

Создай саму папку assets/files/icons/ — icons.

Элементы → Дополнительные поля → Главная

ПКМ, Создать новый TV здесь. Имя: tpl.1.benefits, Подпись: Преимущества компании, Порядок сортировки: 2.

Вкладка дополнительного поля Параметры ввода; Тип ввода: migx.

Вкладки формы:


[
{"caption":"Преимущество", "fields": [
  {
    "field":"icon",
    "caption":"Иконка",
    "inputTVtype":"image",
    "sourceFrom":"migx"
  },
  {
    "field":"link",
    "caption":"Ссылка"
  },
  {
    "field":"title",
    "caption":"Заголовок"
  },
  {
    "field":"about",
    "caption":"Описание",
    "inputTVtype":"richtext"
  }
]}
]

Разметка колонок:


[
  {"header": "Иконка", "width": "160", "sortable": "false", "dataIndex": "icon","renderer": "this.renderImage"},
  {"header": "Заголовок", "sortable": "true", "dataIndex": "title"},
  {"header": "Ссылка", "sortable": "true", "dataIndex": "link"}
]

Источники файлов: выбирай Хранилище иконок. Вкладка Доступно для шаблонов, ставь галочку напротив шаблона Главная страница.

Дополнительное поле преимущества компании

Заостри внимание! Этот источник файлов не привязывается к id ресурса, а почему? Все естественно: в папку /assets/files/icons/ будут загружаться иконки, и хорошо бы обладать к этому «Хранилищу иконок» постоянным доступом из любых других TV-полей. Ибо, я хочу: чтобы была возможность использовать эти иконки и дальше, не загружая их каждый раз заново на новых страницах, отличающихся по id (и еще, ибо, я хочу понтиак джитио 68 года). Тут нужно интуитивно понимать, как будет эксплуатироваться сайт, и если это понимание есть, у тебя не составит труда, назначить корректные источники файлов.

Редактирование дополнительного поля преимущества компании

Создай чанк для вывода на сайт: Чанки → Элементы → tpl.1.benefits.one


<div>
  <div><img src="[[+icon]]" alt="[[+title]]" /></div>
  <div>[[+title]]</div>
  <div>
    [[+about]]
    <a href="[[+link]]">Подробнее</a>
  </div>
</div>

В нужные места на главной странице (чанк tpl.1), добавь:


[[getImageList
  :toPlaceholder=`tpl.1.benefits`
  ?
  &tvname=`tpl.1.benefits`
  &limit=`0`
  &tpl=`tpl.1.benefits.one`
]]

<div>
  [[+tpl.1.benefits]]
</div>

Как ты уже заметил, ничего сверхъестественного в создании уникальных полей для ввода данных, при помощи MIGX — нет. Используются всего две вкладки: Вкладки формы и Разметка колонок, а настройки дополнительного поля передаются массивом в формате json. Трам-пам. Вот-вот, доберешься до визуального конфигуратора и MIGXdb — аще слетишь с катушек, столько всего великого, там можно свершить со вселенской прытью: но, чтобы разобраться — приготовься основательно попотеть серой субстанцией и покакать перед сном, чтобы не просыпаться среди ночи.

У Василия, есть утилита, для проверки json. А, например, тот самый талантливый анонимус, подзапарился и набросал ценный генератор настроек MIGX, да так — что остается только скопировать итоговый код. Естественно, этот генератор не обладает всеми настройками, но основными возможностями наделяет, все остальное смотри в документации, к слову у этого же анонимуса есть норм-частичная документация MIGX на русском.

Неизбежно надлежит рассмотреть еще одну дивную возможность MIGX, — ввод с разных форм и вывод на сайт с помощью плейсхолдеров. Суть такая — например, в контент сайта, менеджеру нужно без специальных знаний включать сложные блоки html: типа разбиения текста на необычайные колонки или какие-нибудь махинации с галереями изображениями. Конечно, не каждый менеджер, на такое способен, посему нужно максимально упростить миссию ввода этих самых данных. Да и намного удобнее, с такого рода задачами справляться плейсхолдерами, нежели копаться в исходниках визуального редактора или типа того. Ядреные помидоры, о чем это я?

Ядреные помидоры

Создай категорию Генератор контента, порядок сортировки 99.

В этой категории сотвори чанк tpl.generator.img, с кодом:


<div>
    <img src="[[+img]]" title="[[+title]]" alt="[[+alt]]" />
</div>

Код, может быть естественно не обязательно таким, смысл в том — что ты его можешь настроить под определенные события js, с каким угодном html-ем, а обработанное содержимое будет выводится в контент сайта, ну просто супер легко.

Там же, сделай чанк tpl.generator.columns под колоночную верстку:


<div classs="columns">
    
    <div>
        <div>[[+title_1]]</div>
        <div>[[+text_1]]</div>
    </div>
    
    <div>
        <div>[[+title_2]]</div>
        <div>[[+text_2]]</div>
    </div>
    
</div>

Теперь нужно сделать дополнительное поле в категории Генератор контента, с названием tpl.generator, подпись Генератор сетки. Доступно для шаблонов: галочки на главную страницу, статические и т.д. везде где будем юзать. Источники файлов: Ресурс

Тип ввода: MIGX

Вкладки формы:


[

{
    "formname":"Картинка с увеличением"
    ,"formtabs": [{
        "caption":"Картинка с увеличением"
        ,"fields": [{
            "field":"placeholder"
            ,"inputTVtype":"hidden"
            ,"default":"grid"
        },
        {
            "field":"MIGX_chunk"
            ,"inputTVtype":"hidden"
            ,"default":"tpl.generator.img"
        },
        {
            "field":"alt"
            ,"caption":"alt"
        },
        {
            "field":"title"
            ,"caption":"title"
        },
        {
            "field":"img"
            ,"caption":"Изображение"
            ,"inputTVtype":"image"
            ,"sourceFrom":"migx"
        }]
    }]
},

{
    "formname":"Две колонки"
    ,"formtabs": [{
        "caption":"Две колонки"
        ,"fields": [{
            "field":"placeholder"
            ,"inputTVtype":"hidden"
            ,"default":"grid"
        },
        {
            "field":"MIGX_chunk"
            ,"inputTVtype":"hidden"
            ,"default":"tpl.generator.columns"
        },
        {
            "field":"title_1"
            ,"caption":"Заголовок 1"
        },
        {
            "field":"text_1"
            ,"caption":"Колонка 1"
            ,"inputTVtype":"richtext"
            ,"sourceFrom":"migx"
        },
        {
            "field":"title_2"
            ,"caption":"Заголовок 2"
        },
        {
            "field":"text_2"
            ,"caption":"Колонка 2"
            ,"inputTVtype":"richtext"
            ,"sourceFrom":"migx"
        }]
    }]
},

{
    "formname":"Тестовая сетка"
    ,"formtabs": [{
        "caption":"Тестовая сетка"
        ,"fields": [{
            "field":"placeholder"
            ,"inputTVtype":"hidden"
            ,"default":"grid"
        },
        {
            "field":"MIGX_chunk"
            ,"inputTVtype":"hidden"
            ,"default":"tpl.generator.test"
        },
        {
            "field":"test"
            ,"caption":"Тестовое поле"
        }]
    }]
}

]

Разметка колонок:


[
{"header": "Плейсхолдер", "sortable": "true", "dataIndex": "placeholder", "renderer": "this.renderPlaceholder"}
]

Во первых, при редактировании страницы появится инструмент для создания кастомных блоков html. Из списка выбираем интересующий блок и поля для его ввода мгновенно подгружаются:

инструмент для создания кастомных блоков

Во вторых, для того чтобы включить их содержимое в контент страницы, используются плейсхолдера, например: [[+grid.1]]

используются плейсхолдера

Чтобы плейсхолдеры обрабатывались при генерации страницы, добавь следующий код в начало той страницы, где будет производиться эта обработка или в общий шаблон:


[[getImageList? &tpl=`@FIELD:MIGX_chunk`&tvname=`tpl.generator`&toSeparatePlaceholders=`grid`]]

В конфигурации дополнительного поля, последним: Тестовая сетка, я привел обрезок кода, девственно чистый, с него можешь начинать собирать свои кастомные сетки. Если разобрать дословно:


{
  "field":"placeholder"
  ,"inputTVtype":"hidden"
  ,"default":"grid"
}

Это скрытое поле placeholder, оно обрабатывается в название плейсхолдера, тот, что ты видишь в названии сетки.


{
  "field":"MIGX_chunk"
  ,"inputTVtype":"hidden"
  ,"default":"tpl.generator.test"
}

Это поле MIGX_chunk используется для подстановки нужного чанка при генерации контента.


{
  "field":"test"
  ,"caption":"Тестовое поле"
}

Это тестовое поле test для ввода данных.

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

По подобию, делается генерация посадочных страниц. Создай шаблон Посадочная страница, с кодом:


<!doctype html>
<html lang="ru">
<head>
[[MetaX?tpl=`мета-теги`]]
[[#1.tv.настройки.prehead]]
</head>
<body>

[[getImageList? &tpl=`@FIELD:MIGX_chunk`&tvname=`landing.generator`]]

[[#1.tv.настройки.prebody]]
</body>
</html>

Создай новую страницу, название Landing, шаблон: Посадочная страница. Галочка: не показывать в меню.

Далее иди в Настройку формРедактирование страниц и создай новый набор правил на действие Обновить ресурс, шаблон: Посадочная страница.

новый набор правил

Там убери галочку: modx-resource-content.

Для того, чтобы поле «Содержимое» не показывалось при редактировании посадочной страницы. Так как лендинги — как правило имеют блочную структуру, то смысл в этом поле по умолчанию отпадает. И сейчас, ты создашь генератор лендинга с блочной структорой, а я посмеюсь над тем, как ты неумело это делаешь. Задача такая, предположим что сам лендинг уже есть, остается только сделать к нему управление через админ-панель. Разрабатывается это все так же с помощью MIGX, а соль в том, что эти блоки можно будет мягкими взмахами мышки менять местами, расширять функционал и главное: ни о чем не парится.

На моем лендинге есть такие блоки:

  • Блок преимущества
  • Заголовок + текст
  • Блок текст + картинка
  • Блок слайдер

Сначала, дополнительное поле, через которое будет собираться landing page, создай его в категории Генератор контента.

  • Имя: landing.generator
  • Подпись: Генератор лендинга
  • Параметры ввода, Тип ввода: MIGX
  • Доступно для шаблонов: Посадочная страница

Далее в параметрах ввода, создадим чистый шаблон под лендинг, Вкладки формы:


[

]

Разметка колонок:


[{
    "header": "Блок"
    ,"sortable": "true"
    ,"width":"400"
    ,"dataIndex": "MIGX_formname"
}]

На самом деле, этот блок ты уже делал для главной страницы, поэтому, в inputTV указываем tpl.1.benefits. Добавь следующий код, меж двух квадратных скобок, на вкладке Параметры ввода → Вкладки формы:


{
    "formname":"Преимущества"
    ,"formtabs": [{
        "caption":"Преимущества"
        ,"fields": [{
            "field":"MIGX_chunk"
            ,"inputTVtype":"hidden"
            ,"default":"landing.benefits"
        },
        {
            "field":"title"
            ,"caption":"Заголовок"
        },
        {
            "field":"benefits"
            ,"caption":"Преимущества"
            ,"inputTV":"tpl.1.benefits"
        }]
    }]
}
Landing page - блок преимущества

Создай чанк Генератор контента → landing.benefits, с содержимым:


<div>
<h3>[[+title]]</h3>
<hr/>

[[getImageList
  ?
  &value=`[[+benefits]]`
  &limit=`0`
  &tpl=`landing.benefits.one`
]]

</div>

Создай чанк Генератор контента → landing.benefits.one


<div>
  <div><img src="/assets/files/icons/[[+icon]]" alt="[[+title]]" /></div>
  <div>[[+title]]</div>
  <div>
    [[+about]]
    <a href="[[+link]]">Подробнее</a>
  </div>
</div>

Тут как раз используется та самая бесконечная вложенность, коей я восхищался ранее.

На вкладку параметры ввода → Вкладки формы, после блока с преимуществами копируй этот код:


{
    "formname":"Заголовок + текст"
    ,"formtabs": [{
        "caption":"Заголовок + текст"
        ,"fields": [{
            "field":"MIGX_chunk"
            ,"inputTVtype":"hidden"
            ,"default":"landing.title.vs.text"
        },
        {
            "field":"title"
            ,"caption":"Заголовок"
        },
        {
            "field":"text"
            ,"caption":"Текст"
            ,"inputTVtype":"richtext"
        }]
    }]
}

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

Landing page - Блок заголовок + текст

Создай чанк Генератор контента → landing.title.vs.text:


<div>
  <h3>[[+title]]</h3>
  <hr/>
  [[+text]]
</div>

Добавь блок на вкладки формы:


{
    "formname":"Картинка + текст"
    ,"formtabs": [{
        "caption":"Картинка + текст"
        ,"fields": [{
            "field":"MIGX_chunk"
            ,"inputTVtype":"hidden"
            ,"default":"landing.img.vs.text"
        },
        {
            "field":"title"
            ,"caption":"Заголовок"
        },
        {
            "field":"text"
            ,"caption":"Текст"
            ,"inputTVtype":"richtext"
        },
        {
            "field":"img"
            ,"caption":"Картинка"
            ,"inputTVtype":"image"
        },
        {
            "field":"pos"
            ,"caption":"Картинка справа?"
            ,"inputTVtype":"checkbox"
            ,"inputOptionValues":"Да==1"
        }]
    }]
}
Landing page - Блок текст + картинка

Создай чанк Генератор контента → landing.img.vs.text


<div>
  <div>
    <img src="[[+img]]" />
  </div>
  <div>
    <h3>[[+title]]</h3>
    [[+text]]
  </div>
</div>

Обрати внимание: поле pos, позволяет в верстке определить с какой стороны будет выводится картинка, в чанке это дело просто генерим при помощи phx, если галочка активна, устанавливаем нужный класс.

Добавь блок на вкладки формы:


{
    "formname":"Слайдер"
    ,"formtabs": [{
        "caption":"Слайдер"
        ,"fields": [{
            "field":"MIGX_chunk"
            ,"inputTVtype":"hidden"
            ,"default":"landing.slider"
        },
        {
            "field":"slider"
            ,"caption":"Слайдер"
            ,"inputTV":"tpl.1.slider"
        }]
    }]
}

«inputTV»:»tpl.1.slider», значит что используем уже готовое поле с главной страницы.

Landing page - Блок слайдер

Создай чанк Генератор контента → landing.slider:


<div>
[[getImageList
  ?
  &value=`[[+slider]]`
  &limit=`0`
  &tpl=`landing.slider.slide`
]]
</div>

Создай чанк Генератор контента → landing.slider.slide:


<div>
  <div>[[+caption]]</div>
[[$img?
  &imgThumb=`[[phpthumbon?input=`/assets/files/slider/[[*id]]/[[+image]]`&options=`&h=540&zc=0`]]`
  &alt=`[[+alt]]`
  &title=`[[+title]]`
]]
</div>

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

Landing page - итог

26 марта 2017, 11:45

WEB разработка | Мультизагрузка изображений в админке MODX Revolution при помощи MIGX

В этом туториале мы узнаем, как мы можем использовать динамический медиа-источник с собственной автоматически созданной папкой для каждого ресурса. Для одновременной загрузки нескольких файлов мы будем использовать диалог multiupload MODX. Все загруженные файлы будут автоматически добавлены в качестве элементов в сетку MIGX. Удаление элементов приведет к удалению файла изображения.

Шаг 1. Создаем динамический медиа-источник.

В админке переходим в раздел Медиа — Источники файлов.

Создаем новый источник файлов со следующими параметрами:

  • Имя: ResourceMediaPath
  • Тип источника файлов: Файловая система

Редактируем созданный источник файлов:

  • прописываем значения для basepath и baseurl: migxResourceMediaPath? &pathTpl=`assets/resourceimages/{id}/` &createFolder=`1`

Вам также может потребоваться создать каталог с разрешениями на запись для php: assets/resourceimages/

Шаг 2. Создаем переменную (TV)

Закладка «Общая информация»

Имя: resourcealbum

Закладка «Параметры ввода»

Тип ввода: migx

Конфигурации: resourcealbum

Закладка «Доступно для шаблонов»

Отмечаем нужный шаблон, к которому будет привязана переменная

Закладка «Источники файлов»

Для вашего контекста (по умолчанию — web) укажите источник файлов ResourceMediaPath

Шаг 3. Создаем конфигурацию

  1. Переходим: Приложения->MIGX->Закладка: MIGX
  2. Создаем новую конфигурацию кликом по «Добавить элемент»
  3. Жмем ‘Выполнено’ для сохранения конфигурации
  4. Кликаем правой кнопкой мыши по созданной конфигурации и выбираем  ‘Экспорт/импорт’
  5. Вставляем в поле Json следующий код:
{
  "formtabs":[
    {
      "MIGX_id":71,
      "caption":"Image",
      "print_before_tabs":"0",
      "fields":[
        {
          "field":"title",
          "caption":"Title",
          "MIGX_id":327,
          "pos":1
        },
        {
          "MIGX_id":329,
          "field":"description",
          "caption":"Description",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"test",
          "useDefaultIfEmpty":"0",
          "pos":2
        },
        {
          "MIGX_id":330,
          "field":"showBtn",
          "caption":"Show button",
          "description":{
            "field":"showBtn",
            "caption":"Show button",
            "inputTV":"showBtn"
          },
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"checkbox",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"yes==yes",
          "default":"yes",
          "useDefaultIfEmpty":1,
          "pos":3
        },
        {
          "MIGX_id":425,
          "field":"image",
          "caption":"Image",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"image",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"none",
          "sourceFrom":"migx",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":4
        }
      ],
      "pos":1
    }
  ],
  "contextmenus":"edit_migx||duplicate_migx||remove_migx_and_image||movetotop_migx||movetotop_bottom",
  "actionbuttons":"loadfromsource||uploadfiles",
  "columnbuttons":"",
  "filters":"",
  "extended":{
    "migx_add":"Add Image",
    "disable_add_item":1,
    "add_items_directly":"",
    "formcaption":"Image",
    "update_win_title":"",
    "win_id":"resourcegallery",
    "maxRecords":"",
    "addNewItemAt":"bottom",
    "multiple_formtabs":"",
    "multiple_formtabs_label":"",
    "multiple_formtabs_field":"",
    "multiple_formtabs_optionstext":"",
    "multiple_formtabs_optionsvalue":"",
    "actionbuttonsperrow":4,
    "winbuttonslist":"",
    "extrahandlers":"this.handleColumnSwitch",
    "filtersperrow":4,
    "packageName":"",
    "classname":"",
    "task":"",
    "getlistsort":"",
    "getlistsortdir":"",
    "sortconfig":"",
    "gridpagesize":"",
    "use_custom_prefix":"0",
    "prefix":"",
    "grid":"",
    "gridload_mode":1,
    "check_resid":1,
    "check_resid_TV":"",
    "join_alias":"",
    "has_jointable":"yes",
    "getlistwhere":"",
    "joins":"",
    "hooksnippets":"",
    "cmpmaincaption":"",
    "cmptabcaption":"",
    "cmptabdescription":"",
    "cmptabcontroller":"",
    "winbuttons":"",
    "onsubmitsuccess":"",
    "submitparams":""
  },
  "columns":[
    {
      "MIGX_id":1,
      "header":"ID",
      "dataIndex":"MIGX_id",
      "width":10,
      "renderer":"",
      "sortable":"false",
      "show_in_grid":1
    },
    {
      "MIGX_id":2,
      "header":"Title",
      "dataIndex":"title",
      "width":20,
      "sortable":"false",
      "show_in_grid":1,
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":"this.textEditor"
    },
    {
      "MIGX_id":3,
      "header":"Image",
      "dataIndex":"image",
      "width":20,
      "renderer":"this.renderImage",
      "sortable":"false",
      "show_in_grid":1
    },
    {
      "MIGX_id":4,
      "header":"Published",
      "dataIndex":"published",
      "width":"",
      "sortable":"false",
      "show_in_grid":1,
      "renderer":"this.renderSwitchStatusOptions",
      "clickaction":"switchOption",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":[
        {
          "MIGX_id":1,
          "name":"published",
          "use_as_fallback":1,
          "value":1,
          "clickaction":"switchOption",
          "handler":"",
          "image":"assets\/components\/migx\/style\/images\/cb_ticked.png"
        },
        {
          "MIGX_id":2,
          "name":"published",
          "use_as_fallback":"",
          "value":1,
          "clickaction":"switchOption",
          "handler":"",
          "image":"assets\/components\/migx\/style\/images\/cb_ticked.png"
        },
        {
          "MIGX_id":3,
          "name":"unpublished",
          "use_as_fallback":"",
          "value":"0",
          "clickaction":"switchOption",
          "handler":"",
          "image":"assets\/components\/migx\/style\/images\/cb_empty.png"
        }
      ],
      "editor":""
    }
  ]
}


Готово, можно использовать

Теперь вы сможете создавать ресурсы-галереи, использовать пакетную загрузку изображений и синхронизировать элементы MIGX с вашими файлами. Для вывода изображений в Front-end используйте стандартные средства MIGX — getImageList:

[ [getImageList?
  &tvname=`resourcealbum`
  &tpl=`@CODE:<h4></h4><img src="" />`
  &where=`{"published":"1"}`
]]

Либо используйте внешний чанк, если предполагается обработка изображений при помощи phpthumb или что-то типа того:

[ [getImageList?
  &tvname=`resourcealbum`
  &tpl=`imageTpl`
  &where=`{"published":"1"}`
]]

Есть нюанс, достаточно неприятный: файлы сохраняются в папку assets/resourceimages/{id}/, но id у ресурса появится только после того, как ресурс будет сохранен. То есть если вы создадите ресурс и попытаетесь загрузить изображения — все они загрузятся в корень сайта. Это плохо. Чтобы не допустить подобного, спрячем наше поле и будем показывать его только для сохраненного документа. В тот момент, когда поле спрятано — отображаем вместо него сообщение с призывом сохранить документ. Встроенного механизма для отображения подобных сообщений в MODX нет, поэтому используем костыль:

Создаем новое TV с именем resourcealbum-fake типа checkbox, в поле «Подпись» или «Описание» размещаем нужный текст (например, «Документ не сохранен! Сохраните документ!»). Так как мы не указали никакой разметки для данного поля — при редактировании документа выведется только подпись и описание поля.

Осталось заставить админку MODX отображать поле resourcealbum-fake и прятать поле resourcealbum при создании документа (до первого сохранения) и наоборот, отображать поле resourcealbum и прятать поле resourcealbum-fake при редактировании документа.

Открываем Сервис — Настройка форм. Жмем «Создать новый профиль». Называем как нравится (gallery, например), ставим галочку «Активный», сохраняем.

На созданном профиле кликаем правой кнопкой мыши — «Редактировать». Теперь нам нужно добавить два набора правил. Жмем «Новый набор павил», действие: «Создать ресурс«, шаблон: «Фотогалерея» (выбираете шаблон, к которому привязаны TV resourcealbum и resourcealbum-fake. Сохраняем.

На созданном только что правиле  кликаем правой кнопкой мыши — «Редактировать». Выбираем закладку «Дополнительные поля» и снимаем галочку напротив resourcealbum.

Повторяем процедуру для поля resourcealbum-fake:

Открываем Сервис — Настройка форм. На профиле gallery кликаем правой кнопкой мыши — «Редактировать». Жмем «Новый набор правил», действие: «Обновить ресурс«, шаблон: «Фотогалерея» . Сохраняем.

На созданном только что правиле  кликаем правой кнопкой мыши — «Редактировать». Выбираем закладку «Дополнительные поля» и снимаем галочку напротив resourcealbum-fake.

Все, теперь при создании ресурса после выбора шаблона в закладке «Дополнительные поля» вместо поля MIGX с возможностью загрузки изображений будет отображаться надпись «Документ не сохранен! Сохраните документ!».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *