Шаблон для главной страницы
Как правило, стартовая страница сайта отличается от остальных. Как отразить эту особенность в нашем шаблоне?
Вообще-то очень просто. В массиве $variables есть элемент 'is-default', который мы можем проверить. И если он true, то подтягиваем шаблон главной. Если нет - страницы нужного модуля. Вставим эту проверку в файл main.phtml:
<main> <?php if ($variables['is-default']) echo $this->render($variables, "content/home/index"); else echo $this->render($variables, "{$variables['module']}/{$variables['method']}"); ?> </main>
В объекте $variables['page'] тоже есть такое свойство, но получить его невозможно. Оно, конечно, private. Всегда будет false.
И надо создать в папке php фрагмент шаблона content/home/index.phtml, который подключаем. Для начала пусть будет просто контентная страница:
<?php $page = $variables['page']; ?> <section> <div class="container"> <div class="row"> <div class="col-12"> <h1 umi:element-id="<?= $page->id ?>" umi:field-name="h1" umi:empty="<?= $this->translate('empty_page_name') ?>"><?= $page->h1 ?></h1> </div> <div class="col-12"> <div umi:element-id="<?= $page->id ?>" umi:field-name="content" umi:empty="<?= $this->translate('empty_page_content') ?>"><?= $page->content ?></div> </div> </div> </div> </section>
Добавление блоков
Обычно на главную страницу стараются запихнуть весь контент сайта. Наверно потому, что не надеются, что пользователь настолько заинтересуется, что пройдет куда-то ещё.
Продолжим эту скверную традицию. У нас есть контент главной страницы, где можно разместить информацию о компании или продукте, и новости. Явно не хватает контактов, которые лучше добавить в настройки:
Чтобы к этому не возвращаться, добавим все поля, которые хотели, в частности, ссылки на дерево для новостей и 404 ошибки, а также название компании. Новости уже есть, осталось в настройках выбрать нужный раздел, а вот 404 страницы нет, создадим её.
Вообще хорошим тоном является не портить шаблон данных "Настройки", а создать дочерний шаблон, куда и внести все нужные поля. Это без сомнения пригодится, если на одной системе делать несколько сайтов с разным набором настроек.
Разбиваем шаблон на блоки
Чтобы не тащить простыню кода, разделим content/home/index.phtml на фрагменты по блокам:
<?php echo $this->render($variables, "content/home/intro"); echo $this->render($variables, "content/home/news"); echo $this->render($variables, "content/home/contacts"); ?>
Вводный текст
Фрагмент content/home/intro.phtml останется аналогом контентной страницы:
<?php $page = $variables['page']; ?> <section> <div class="container"> <div class="row"> <div class="col-12"> <h1 umi:element-id="<?= $page->id ?>" umi:field-name="h1" umi:empty="<?= $this->translate('empty_page_name') ?>"><?= $page->h1 ?></h1> </div> <div class="col-12"> <div umi:element-id="<?= $page->id ?>" umi:field-name="content" umi:empty="<?= $this->translate('empty_page_content') ?>"><?= $page->content ?></div> </div> </div> </div> </section>
Новости
Фрагмент для новостей content/home/news.phtml:
<?php $newsList = $variables['settings']->newslist; if (!empty($newsList)) $newsPageId = $newsList[0]->id; else $newsPageId = false; $newsList = $this->macros('news', 'lastlist', [$newsPageId]); ?> <section> <div class="container"> <div class="row"> <div class="col-12"> <h2>Что нового?</h2> </div> <div class="col-12"> <ul class="list-group"> <?php if (!empty($newsList['items'])): foreach ($newsList['items'] as $item): ?> <li class="list-group-item"> <em><?= date("d.m.Y", $item['publish_time']) ?></em> <a href="<?= $item['link'] ?>"><h3 umi:element-id="<?= $item['id'] ?>" umi:field-name="name" umi:empty="<?= $this->translate('empty_page_name') ?>"><?= $item['name'] ?></h3></a> </li> <?php endforeach; endif; ?> </ul> </div> </div> </div> </section>
Контакты
Фрагмент для контактов content/home/contacts.phtml:
<section> <div class="container"> <div class="row"> <div class="col-12"> <h2>Контакты</h2> </div> <div class="col-12"> <div class="row"> <div class="col-6"> <h3><?= $this->translate('address') ?></h3> </div> <div class="col-6"> <h3 umi:object-id="<?= $variables['settings']->id ?>" umi:field-name="address" umi:empty="<?= $this->translate('empty_address') ?>"><?= $variables['settings']->address ?></h3> </div> </div> <div class="row"> <div class="col-6"> <h3><?= $this->translate('phone') ?></h3> </div> <div class="col-6"> <h3 umi:object-id="<?= $variables['settings']->id ?>" umi:field-name="phone" umi:empty="<?= $this->translate('empty_phone') ?>"><?= $variables['settings']->phone ?></h3> </div> </div> </div> </div> </div> </section>
Не забываем пополнять файлы i18n/i18n.ru.php и i18n/i18n.en.php новыми языковыми константами, которые появляются в шаблонах нашего сайта. Также добавили разметку для Edit-in-place, и теперь можем внести адрес и телефон прямо на "морде" сайта.
Организация блоков на главной странице
Хотелось бы дать возможность редактору сайта регулировать контент на главной странице, добавлять и убирать блоки, и чтобы все изменения появлялись на сайте автоматически.
Кто-то из новых разработчиков задал аналогичный вопрос в группе, получил много ответов, которые его не устроили по причине сложной реализации. Что он сделал после этого? У него была верстка, вся такая из разноцветных блоков. Он в "Шаблонах данных" добавил дочерний шаблон в "Раздел сайта", назвал его "Главная", и добавил туда кучу полей типа HTML-текст с кодом section1, section2 и т.д. После чего скопировал код соответствующих блоков из верстки, и вставил в эти поля. Шаблон главной у него при этом получился, видимо, такой:
<?php $page = $variables['page']; ?> <?= ($page->section1)?$page->section1:'' ?> <?= ($page->section2)?$page->section2:'' ?> ...
А что, так можно было??? Конечно, можно. Но некрасиво, и нельзя поменять блоки местами.