Пример компонента шапки
Попробуем создать простой компонент шапки для изучения. Но для начала определимся как именно мы будем его делать. Обычно для шапки делается новый компонент в каталоге components. Так сделано в default-шаблоне (компонент top1). Это универсальный вариант, где основные настройки вынесены в опции компонента (options.ini). Поэтому, если вы предполагаете, что будут какие-то опции, то шапку лучше делать именно стандартным отдельным компонентом.
На практике же часта ситуация, когда создавать опции не всегда оправдано — проще поменять код компонента. Особенно это актуально, если приходится менять классы или html-разметку. В этом случае можно использовать компонент file1, где указать подключаемый php-файл шапки.
Такой подход как раз и используется в нашем базовом шаблоне. Подключаемый файл custom/top1.php. Технически этот тот же самый вариант, если бы мы делали через компонент без опций.
Давайте сделаем новый вариант в custom/top2.php. В настройках шаблона не забудьте его подключить в компоненте file1.
Пусть шапка будет иметь всю ширину браузера и залита каким-нибудь фоновым цветом. Слева будет название сайта, а справа простое одноуровневое меню (из настройки «Второе меню»).
Вначале нужно задать layout-блок. Мы уже знаем как он себя ведёт. Внутренний wrap-блок будет являться flex-контейнером, содержащим два блока-ячейки: название сайта и меню.
<div class="layout-center-wrap bg-blue800"><div class="layout-wrap flex flex-wrap flex-vcenter"> <div class="flex-grow1 w100-tablet"> название сайта </div> <div class="flex-grow5 w100-tablet"> меню </div> </div></div>
Класс .bg-blue800 — цвет фона. Класс .flex-vcenter задает выравнивание внутренностей ячеек по высоте (аля-vertical-align). Класс .w100-tablet, как вы должны уже знать — 100% ширина на tablet.
Классы .flex-grow1 и .flex-grow5 управляют «жадностью» ячеек. Теоретически мы могли бы явно задать ширину ячеек в процентах, но по факту мы не знаем каково будет их реальное наполнение. Скажем название сайта — большая ячейка, а меню малое. А если наоборот?
Вот здесь как раз «жадность» и используется. В данном случае предполагается, что первая ячейка должна быть менее «жадной» (меньшей по ширине), чем вторая. Число указывает на степень «жадности»: 1 против 5. По умолчанию для flex-ячеек «жадность» равна нулю.
Название сайта следует выводить в виде ссылки, но на главной ссылку следует убрать. Получается вот такой код:
...
{% if (!is_type('home')) : %}
<a class="i-globe t-white hover-t-blue200 hover-no-underline" href="{{ getinfo('site_url') }}">{{ getinfo('name_site') }}</a>
{% else : %}
<i class="i-globe"></i>{{ getinfo('name_site') }}
{% endif %}
...
Здесь я использую возможности встроенного php-шаблонизатора. Блок «{% %}» эквивалентен «<?php ?>», а блок «{{ }}» эквивалентен php-функции «echo». Также я использую альтернативный php-синтаксис для if.
То есть у нас if-условие, которое проверяет главную страницу (!is_type('home')): если это не главная, то выводим ссылку, иначе просто иконку и название сайта (через getinfo()).
Иконки задаются с помощью классов «i-». Класс .hover-t-blue200 задает поведение ссылки hover (наведение) — будет установлен цвет текста светло-синий. Класс .hover-no-underline убирает подчеркивание ссылки при наведении.
Свойства текста мы зададим уже в классах ячейки.
...
<div class="flex-grow1 w100-tablet t-center-tablet t-white pad10 t120 t150-tablet">
{% if (!is_type('home')) : %}
<a class="i-globe t-white hover-t-blue200 hover-no-underline" href="{{ getinfo('site_url') }}">{{ getinfo('name_site') }}</a>
{% else : %}
<i class="i-globe"></i>{{ getinfo('name_site') }}
{% endif %}
</div>
...
Здесь я добавил классы
-
.t-center-tablet— выравнивание по центру для tablet -
.t-white— белый текст -
.pad10— отступы по 10px -
.t120— размер шрифта 120% -
.t150-tablet— размер шрифта 150% для tablet
Если вы проверите этот код, то обнаружите, что классы для tablet не срабатывают. Это потому что в _variables.scss отключено их создание в переменной $screen_media_text_step_list. Уберите комментарий, чтобы получилось так:
$screen_media_text_step_list: ( "tablet": $SCREEN_TABLET, "phone": $SCREEN_PHONE, );
После sass-компиляции классы станут доступны.
Для вывода меню используем стандартный вариант MaxSite CMS.
...
<nav><ul class="menu-simple pad10-tb t-blue100 t90 links-no-color t-center-tablet">
{%
if ($menu = mso_get_option('menu2', 'templates', '/ | Главная ~ about | О сайте'))
echo mso_menu_build($menu, 'selected', false);
%}
</ul></nav>
...
Тэг NAV указывает на html5-семантику этого блока. Само же меню формируется в виде ul/li-списка. Но мы помним, что это простое меню в одну строчку, а для такого меню предназначается специальный класс .menu-simple. Его код расположен в файле _menu-simple.scss.
Класс .t90 задает 90% размер текста. Класс .links-no-color задаёт поведение ссылок: их цвет будет совпадать с цветом контейнера (.t-blue100). Если его не указывать, то цвет будет такой же как и у всех остальных ссылок.
Размеры текста в UniCSS определяются в единицах rem, то есть от основного BODY-тэга. Базовая типографика задается в_base.scss. По умолчанию указаноfont-size: 16px;, следовательно.t90— это 90% от 16 = 14,4px. Rem-единицы тем и удобны, что всегда указывают на единое числовое значение, не зависимо от свойств родителя.
Класс .pad10-tb задает 10px отступ сверху и снизу. Это нужно для того, чтобы меню не «прилипало» к низу контейнера.
Приводу полный код файла, чтобы вы не запутались.
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); ?>
<div class="layout-center-wrap bg-blue800"><div class="layout-wrap flex flex-wrap flex-vcenter">
<div class="flex-grow1 w100-tablet t-center-tablet t-white pad10 t120">
{% if (!is_type('home')) : %}
<a class="i-globe t-white hover-t-blue200 hover-no-underline" href="{{ getinfo('site_url') }}">{{ getinfo('name_site') }}</a>
{% else : %}
<i class="i-globe"></i>{{ getinfo('name_site') }}
{% endif %}
</div>
<div class="flex-grow5 w100-tablet">
<nav><ul class="menu-simple pad10-tb t-blue100 t90 links-no-color t-center-tablet">
{%
if ($menu = mso_get_option('menu2', 'templates', '/ | Главная ~ about | О сайте'))
echo mso_menu_build($menu, 'selected', false);
%}
</ul></nav>
</div>
</div></div>
Код достаточно простой, и обратите внимание, что нам не пришлось писать ни единой строчки css-стилей.
Если придется что-то менять на рабочем сайте, то подредактировать файл можно через админ-панель «Файлы».
Если есть вопросы, задавайте в комментариях.