Ребята, мы дошли с вами до главной страницы. Теперь мы сможем зафигачить практически все, что на ней есть, за исключением, конечно новостей. В данном уроке мы с вами рассмотрим несколько полезных фишек, которые меня выручали не раз.
Начнем мы с вами с полей, для которых нам понадобится компонент MIGX, а именно это будет слайдер и блок с преимуществами. В нашем случае, мы также воспользуемся статьей, которую я писал ранее “MODx Revo, использование MIGX в проектах на примере слайдера”. В ней я достаточно подробно расписал то, как сделать поле MIGX, не используя конструктор конфигураций.
Начнем с нашего слайдера. Для начала создадим TV-поле slider, конечно в параметрах ввода нужно указать тип ввода — MIGX, где в праметрах ввода указываем следующие вкладки формы:
[{"caption":"Image", "fields": [ {"field":"set","caption":"Заголовок"}, {"field":"description","caption":"Текст"}, {"field":"image","caption":"Изображение","inputTVtype":"image"}, {"field":"resid","caption":"ID ресурса для перехода"} ] }]
Разметкиколонок:
[{ "header": "Заголовок", "sortable": "true", "dataIndex": "set" },{ "header": "Текст", "sortable": "true", "dataIndex": "description" },{ "header": "Изображение", "sortable": "false", "dataIndex": "image","renderer": "this.renderImage" },{ "header": "ID ресурса для перехода", "sortable": "true", "dataIndex": "resid" }]
Хотя у нас с вами нет на слайдах ни заголовка, ни текста, я все-таки оставил эти параметры. Теперь мы можем заполнить наш слайдер:
После заполнения мы с вами можем приступить к выводу нашего слайдера. Шаблонизатор Fenom предоставляет классную возможность обработки наших TV-параметров MIGX. Например, наш слайдер можно вывести вот так (к сожалению, пока не нашел как обработать источник файлов):
{set $rows = json_decode($_modx->resource.slider, true)} {foreach $rows as $idx => $row} <div> {if $row.resid?}<a href="{$row.resid | url}">{/if} {set $image = $_modx->runSnippet('phpthumbon', [ 'input' => 'assets/files/'~$row.image, 'options' => 'w=1920&h=395&zc=1&q=99' ])} <img src="{$image}" alt="{$row.set}"> {if $row.resid?}</a>{/if} </div> {/foreach}
Или воспользоваться стандартным сниппетом getImageList, но здесь у нас не будет работать в чанках Fenom:
{$_modx->runSnippet('getImageList', [ 'tvname' => 'slider', 'tpl' => 'sliderTpl' ])}
Чанк sliderTpl:
<div> <img src="[[+image]]" alt="[[+set:htmlent]]"> </div>
При использовании Fenom, я вам советую использовать первый вариант. Соответственно, аналогично нам нужно реализовать преимущества под слайдером. Создаем TV-параметр advantages, где вкладки формы:
[{"caption":"Image", "fields": [ {"field":"set","caption":"Заголовок"}, {"field":"description","caption":"Текст"}, {"field":"iconclass","caption":"Класс иконки"} ] }]
Разметка колонок:
[{ "header": "Заголовок", "sortable": "true", "dataIndex": "set" },{ "header": "Текст", "sortable": "true", "dataIndex": "description" },{ "header": "Класс иконки", "sortable": "true", "dataIndex": "iconclass" }]
Наполняем преимущества в панели администратора.
И в синтаксисе Fenom вызов в шаблоне:
{set $rows = json_decode($_modx->resource.advantages, true)} {foreach $rows as $idx => $row} <div class="col-lg-4 item-wrap"> <div class="item"> <div class="icons"> <i class="fa {$row.iconclass}"></i> </div> <span class="title">{$row.set}</span> <p>{$row.description}</p> </div> </div> {/foreach}
Отлично! У нас с вами есть два рабочих блока на главной странице. Предлагаю перейти к каталогу. Если мы посмотрим на блок каталога на главной, то увидим, что у нас должно быть еще 2 параметра:
- тип плитки (широкий, узкий)
- изображение для главной страницы
Для TV-параметра типа плитки я выбрал имя main_type, и заполнен он у меня следующим образом (просто выведу 2 скриншота, а в видео вы подробно посмотрите):
Теперь создадим TV-параметр main_img по аналогии с уже созданным – menu_image. Осталось заполнить данные поля у категорий товаров:
И теперь предлагаю вывести все это дело с помощью pdoResources в шаблоне главной страницы:
{$_modx->runSnippet('pdoResources', [ 'parents' => 2, 'depth' => 0, 'tpl' => '@FILE chunks/rubric_list.tpl', 'includeTVs' => 'main_type,main_img', 'processTVs' => 1, 'sortby' => 'menuindex', 'sortdir' => 'ASC', 'limit' => 0 ])}
И чанк rubric_list.tpl:
<div class="{$_pls['tv.main_type'] == 1 ? 'col-sm-3' : 'col-sm-6'} item-wrap"> <div class="item"> <a href="{$id | url}"> <img src="{if $_pls['tv.main_type'] == 1?}{$_pls['tv.main_img'] | phpthumbon: 'w=280&h=200&zc=1'}{else}{$_pls['tv.main_img'] | phpthumbon: 'w=560&h=200&zc=1'}{/if}" alt="{$pagetitle | htmlent}"> <span>{$pagetitle}</span> </a> </div> </div>
Олично! Мы с вами вывели каталог товаров. Как легко у нас все получается – прямо сказка.
Сейчас я расскажу вам как сделать блок с хитами продаж. Как правило, большинство заказчиков просят для данного блока ручное управление. Я придумал следующий способ реализации:
- Создать TV-параметр для хранения товаров
- Написать сниппет для вывода этих товаров на основе pdoTools, чтобы сохранился порядок сортировки
Выглядит в админке это примерно так:
Для реализации нам понадобится компонент SuperBoxSelect из официального репозитория.
Создаем TV-параметр products для наших хитов продаж. Также приведу вам скриншоты:
И предлагаю вам наполнить данное TV-поле:
Для вывода данных товаров я написал специальный сниппет products.php:
<?php if (!$modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) { return false; } $pdoFetch = new pdoFetch($modx, $scriptProperties); $productsarr = explode("||", $products); $output = ''; foreach($productsarr as $item){ $object = $modx->getObject("msProduct", $item); if($object){ $data = $object->toArray(); $output .= $pdoFetch->getChunk($tpl, $data); } } echo $output;
Сниппет довольно простой и принимает 2 параметра: products – это содержимое нашего TV и tpl – чанк для вывода. Вызов в шаблоне будет примерно такой:
{$_modx->runSnippet("@FILE snippets/products.php", [ 'products' => $_modx->resource.products, 'tpl' => '@FILE chunks/product_tpl.tpl' ])}
А теперь попробуйте поменять порядок товаров просто перетаскивая их лайбочки – согласитесь очень удобно!
Для выбора изображений для слайдера советую ставить:
mixedImage