В данном уроке мы с вами поработаем с MIGX и посмотрим какие TV-параметры мы сможем с вами сделать с помощью данного компонента. Гибкость его не знает границ. Но для начала мы с вами создадим новый источник файлов, чтобы пользователи и администраторы сайта не грузили все в одну кучу.
Создаем новый источник файлов.
Для начала давайте создадим в папке “assets” каталог “files”. Он будет у нас домашним каталогом для пользовательских файлов.
Теперь перейдем в “Медиа -> Источники файлов” и создадим новый источник “Content”.
Отлично! Теперь перейдите в редактирование данного источника файлов и заполните следующие параметры:
- basePath – “assets/files/”
- baseUrl — “assets/files/”
Теперь в дереве файлов на вкладке “Файлы” вы сможете увидеть новый источник файлов, если обновите страницу. Для того, чтобы проверить его функционирование, создайте в источнике “filesystem” в папке “assets/files/” какой-нибудь файл и обновите страницу, если он отобразится в нашем источнике “Content” мы все сделали правильно.
Надеюсь, у вас все получилось! Теперь давайте зададим данный источник файлов как источник “по умолчанию”. Для этого перейдите в системные настройки и найдите настройку с ключом “ default_media_source” в разделе “Панель управления” и выберите наш источник файлов “Content”.
Класс! Сейчас в визуальном редакторе и во всех наших будущих TV-полях будут отображаться элементы из данного источника файлов.
Используем MIGX
Мы с вами начнем использовать MIGX с блока преимуществ. Если внимательно посмотрим на данный блок, то мы увидим, что карточки преимуществ имеют следующие поля:
- Иконка
- Заголовок
- Описание
Стандартными TV-полями MODx мы не сможем реализовать данную конструкцию, поэтому на помощь к нам придет MIGX. Если вы не установили данный компонент из официального репозитория, то вам нужно поторопиться.
TV-поле у нас будет выглядеть следующим образом:
И в режиме редактирования:
Итак, создадим категорию “Преимущества” и начнем создавать новое TV-поле “advantages”.
На первой вкладке “Общая информация” задаем следующие значения:
- Имя – “advantages”
- Подпись – “Преимущества”
- Категория – “Преимущества”
- Описание – “Если не заполнено, не выведется секция преимуществ”
Переходим на вкладку “Параметры ввода” и указываем тип ввода “MIGX”, после чего у нас погрузятся поля для данного типа ввода. Так как мы с вами создаем составное поле, то нам необходимо будет заполнить два параметра:
- Вкладки формы – это перечень всех полей и вкладок данного TV-параметра, задаваемый в формате JSON
- Разметка колонок – это перечень полей, которые необходимо выводить в таблице TV-параметра
Содержимое вкладок формы будет следующее:
[{"caption":"Преимущество", "fields": [
{"field":"title", "caption":"Заголовок"},
{"field":"icon", "caption":"Класс иконки", "description":"например, icofont-dart, аналог font-awesome"},
{"field":"description", "caption":"Описание", "inputTVtype":"richtext"}
]
}]
Как вы видите, в формате JSON у нас есть следующие поля:
- Caption – заголовок формы
- Fields – поля формы
- Field – наименование поля
- Caption – подпись поля
- Description – описание поля
- inputTVtype – тип ввода (если не указано, это обычное текстовое поле)
Надеюсь, вам понятно, как это все строится. Про то как выглядит формат JSON вы можете прочитать в документации на русском языке, а про MIGX у нас есть подробная статья с доступными типами ввода.
Следующий шаг – это разметка колонок. Выглядеть она будет следующим образом:
[{
"header": "Заголовок", "sortable": "true", "dataIndex": "title"
},{
"header": "Класс иконки", "sortable": "true", "dataIndex": "icon"
},{
"header": "Описание", "sortable": "true", "dataIndex": "description"
}]
Мы перечислили поля, какие нам необходимо вывести в таблице. Ключи у нас следующие:
- header – заголовок
- sortable – флаг сортировки по данному полю
- dataIndex – ключ поля
Обратите внимание, что параметр dataindex должен совпасть с параметром field из вкладок формы.
Параметры вывода у нас должны быть “По умолчанию” и на вкладке доступно для шаблонов указываем галочку на шаблоне “Главная страница”. Сохраняем поле и бежим смотреть, что получилось.
Неплохо не правда ли? Я заполняю данное поле теми значениями, которые у нас есть изначально на шаблоне.
Теперь нам все это дело нужно как-то вывести. Для этого в составе MIGX есть сниппет getImageList, который позволяет нам это сделать легко и просто. Создаем чанк вывода наших преимуществ “advantagesTpl”:
<div class="col-md-4 col-sm-6">
<div class="features-single text-center">
<i class="icofont [[+icon]]"></i>
<h4>[[+title]]</h4>
[[+description]]
</div>
</div>
В плейсхолдерах данного чанка у нас ключи наших полей. Далее в шаблоне главной страницы мы вызываем сниппет getImageList:
[[getImageList?
&tvname=`advantages`
&tpl=`advantagesTpl`
]]
Где:
- tvname – наименование нашего TV-поля
- tpl – чанк вывода
Посмотрите, как у нас с вами замечательно все вывелось! Теперь досоздадим еще два параметра, чтобы закончить с данной секцией:
- advsectitle – подпись – заголовок, параметры ввода – текст, параметры вывода – по умолчанию, шаблон – главная страница
- advsecdesc — подпись – описание, параметры ввода – текстовая область, параметры вывода – по умолчанию, шаблон – главная страница
Заполните эти поля в ресурсе дефолтными параметрами с шаблона. Секция преимуществ у вас должна получиться следующая:
<
<section id="features-area" class="bg-gray">
<div class="container">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<div class="section-heading text-center">
<h2>[[*advsectitle]]</h2>
<p>[[*advsecdesc]]</p>
</div>
</div>
</div>
<div class="row">
[[getImageList?
&tvname=`advantages`
&tpl=`advantagesTpl`
]]
</div>
</div>
</section>
Аналогично делаем со второй секцией преимуществ. Единственное, что у нас добавится – это картинка. Вкладки формы следующие:
[{"caption":"Преимущество", "fields": [
{"field":"title","caption":"Заголовок"},
{"field":"icon","caption":"Класс иконки","description":"например, icofont-dart, аналог font-awesome"},
{"field":"description","caption":"Описание","inputTVtype":"richtext"},
{"field":"image","caption":"Изображение","inputTVtype":"image","description":"выведется, если используется в данном блоке, может обрезаться"}
]
}]
Разметка колонок:
[{
"header": "Заголовок", "sortable": "true", "dataIndex": "title"
},{
"header": "Класс иконки", "sortable": "true", "dataIndex": "icon"
},{
"header": "Описание", "sortable": "true", "dataIndex": "description"
},{
"header": "Изображение", "sortable": "false", "dataIndex": "image","renderer": "this.renderImage"
}]
По сравнению с предыдущим TV, у нас добавился параметр “renderer”, который отвечает за рендеринг картинки в таблице.
Далее создаем чанк вывода:
[[+_alt <!-- eq="1":then=" -->
<div class="core-features-single">
<div class="row">
<div class="col-sm-6">
<div class="core-feature-img">
<img src="[[+image]]" class="img-responsive" alt="Image">
</div>
</div>
<div class="col-sm-6">
<div class="core-feature-content arrow-left">
<i class="icofont [[+icon]]"></i>
<h4>[[+title]]</h4>
[[+description]]
</div>
</div>
</div>
</div>
<!-- ":else=" -->
<div class="core-features-single">
<div class="row">
<div class="col-sm-6">
<div class="core-feature-content arrow-right">
<i class="icofont [[+icon]]"></i>
<h4>[[+title]]</h4>
[[+description]]
</div>
</div>
<div class="col-sm-6">
<div class="core-feature-img">
<img src="[[+image]]" class="img-responsive" alt="Image">
</div>
</div>
</div>
</div>
`]]
У меня не выводятся модификаторы ввода-вывода, поэтому отметил комментариями значения, а символ " нужно заменить на `. Плейсходер “_alt” равен единице, когда элемент четный, таким образом мы с вами подменим чанки. И заполним наш параметр в ресурсе главной страницы дефолтными значениями с шаблона. Единственное, так как мы с вами сменили источник файлов, то картинки могут не отобразиться, поэтому необходимо продублировать папку assets/images/ в папку assets/files/ images/. Теперь вам стало понятно зачем нужен этот источник файлов? Для того, чтобы менеджер по ошибке или может злому умыслу не удалил жизненно важные системные файлы.
Полный код данной секции у меня получился следующий:
<section id="core-features-area">
<div class="container">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<div class="section-heading text-center">
<h2>[[*adv2sectitle]]</h2>
<p>[[*adv2secdesc]]</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10 col-md-offset-1">
[[getImageList?
&tvname=`advantages2`
&tpl=`adv2Tpl`
]]
</div>
</div>
</div>
</section>
Отлично! Теперь реализуем раздел FAQ (часто задаваемые вопросы). Создаем новую категорию и TV-параметр FAQ. Вкладки формы:
<
[{"caption":"FAQ", "fields": [
{"field":"question","caption":"Вопрос"},
{"field":"answer","caption":"Ответ","inputTVtype":"richtext"}
]
}]
Разметка колонок:
[{
"header": "Вопрос", "sortable": "true", "dataIndex": "question"
},{
"header": "Ответ", "sortable": "true", "dataIndex": "answer"
}]
Создаем чанк для вывода “faqTpl”:
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapse[[+idx]]">[[+question]]</a>
</h4>
</div>
<div id="collapse[[+idx]]" class="panel-collapse collapse [[+idx:eq=`1`:then=`in`]]">
<div class="panel-body">[[+answer]]</div>
</div>
</div>
Еще нам нужно заполнить поле дефолтными значениями и создать 3 TV-параметра:
- Заголовок
- Описание
- Изображение
Надеюсь, что вы с этим справитесь самостоятельно. А у меня в свою очередь секция получила следующий вид:
<section id="faq-area">
<div class="container">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<div class="section-heading text-center">
<h2>[[*faqtitle]]</h2>
<p>[[*faqdesc]]</p>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-6">
<div class="panel-group" id="accordion">
[[getImageList?
&tvname=`faq`
&tpl=`faqTpl`
]]
</div>
</div>
<div class="col-sm-6">
<div class="faq-img">
<img src="[[*faqimage]]" class="img-responsive" alt="Image">
</div>
</div>
</div>
</div>
</section>
Следующая секция – “Отзывы”. Делаем все аналогично второму блоку с преимуществами. Вкладки формы:
[{"caption":"Отзыв", "fields": [
{"field":"title","caption":"Имя"},
{"field":"regaly","caption":"Регалии"},
{"field":"description","caption":"Отзыв","inputTVtype":"richtext"},
{"field":"image","caption":"Изображение","inputTVtype":"image","description":"выведется, если используется в данном блоке, может обрезаться"}
]
}]
Разметка колонок:
[{
"header": "Имя", "sortable": "true", "dataIndex": "title"
},{
"header": "Регалии", "sortable": "true", "dataIndex": "regaly"
},{
"header": "Отзыв", "sortable": "true", "dataIndex": "description"
},{
"header": "Изображение", "sortable": "false", "dataIndex": "image","renderer": "this.renderImage"
}]
Создайте еще 2 поля: заголовок и описание и заполните дефолтными значениями. А чанк “reviewTpl” у меня получился следующий:
<div class="testimonial-single">
<div class="client-comment">
[[+description]]
</div>
<div class="client-info row">
<div class="col-md-4">
<div class="client-img">
<img src="[[+image]]" class="img-responsive" alt="Image">
</div>
</div>
<div class="col-md-8">
<div class="client-details">
<h5>[[+title]]</h5>
<p>[[+regaly]]</p>
</div>
</div>
</div>
</div>
А секция тем временем у меня получилась следующая:
<section id="testimonial-area" class="bg-gray">
<div class="container">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<div class="section-heading text-center">
<h2>[[*reviewtitle]]</h2>
<p>[[*reviewdesc]]</p>
</div>
</div>
</div>
<div class="testimonial-carousel owl-carousel">
[[getImageList?
&tvname=`reviews`
&tpl=`reviewTpl`
]]
</div>
</div>
</section>
В следующей части мы с вами реализуем блок с товарами, сделаем форму обратной связи и форму обратной связи в модальном окне. Спасибо!