В первой части говорилось об основных проблемах с которыми пришлось столкнуться при изучении Gantry 5. Здесь я постараюсь рассказать о вещах на которые стоит обратить внимание перед написанием своего шаблона.
Плагин
Nucleus — шаблоны (/templates/)
В качестве шаблонизатора Gantry 5 использует Twig. По умолчанию внутрь плагина встроен каркас на который стоит опираться при создании собственной темы (он расположен по адресу /плагин/engines/nucleus/).
Большинство twig-шаблонов которые будут созданы в дальнейшем в теме должны наследоваться от одного из представленных здесь файлов. Это позволит сохранять единую структуру, а с помощью принципов работы twig можно будет корректировать любые блоки описанные здесь. Внутри уже есть базовые twig-шаблоны. Вот некоторые из них:
templates/page.html.twig — базовая разметка страницы. Все twig-шаблоны созданные в теме, должны быть унаследованы от этого файла для сохранения единой структуры.
Блоки описанные в шаблоне:
- content;
- page_offcanvas;
- page_layout;
- page_top;
- page_bottom;
- body_top;
- body_bottom;
- page_head;
- page_footer.
Эти блоки могут быть переопределены в шаблоне после наследования на стороне темы.
Сама структура страницы выглядит вот так:
{# Основной блок шаблона в котором создаётся каркас страницы #}
{%- block page -%}
<!DOCTYPE {{ gantry.config.page.doctype|default('html')|raw }}>
<html{{ gantry.page.htmlAttributes|raw }}>
{{ page_head|raw }}
{% block page_body -%}
<body{{ gantry.page.bodyAttributes({'class': [offcanvas_position, gantry.page.preset, 'g-style-' ~ gantry.theme.preset]})|raw }}>
{{ gantry.config.page.body.body_top|raw }}
{{ body_top|raw }}
{{ page_offcanvas|raw }}
<div id="g-page-surround">
{% if page_offcanvas|trim %}
<div class="g-offcanvas-hide g-offcanvas-toggle" data-offcanvas-toggle><i class="fa fa-fw fa-bars"></i></div>
{% endif %}
{{ page_top|raw }}
{{ page_layout|raw }}
{{ page_bottom|raw }}
</div>
{{ body_bottom|raw }}
<script type="text/javascript" src="{{ url('gantry-assets://js/main.js') }}"></script>
{{ page_footer|raw }}
{{ gantry.config.page.body.body_bottom|raw }}
</body>
{%- endblock %}
</html>
{% endblock -%}
Стоит отметить что при изучении Gantry 5 я столкнулся с небольшой проблемой. При рендере страницы в коде появляется много пустых строк (некрасиво смотрится). В качестве решения рекомендую использовать в шаблонах темы twig-конструкцию {% spaceless %}{% endspaceless %}. Получается минифицированный код.
templates/page_head.html.twig — шаблон шапки сайта. Вызывается в блоке page_head файла templates/page.html.twig.
Блоки описанные в шаблоне:
- head_meta;
- head_title;
- head_application;
- head_ie_stylesheets;
- head, head_custom.
В этом же шаблоне устанавливаются атомы.
<head>
{% block head_meta %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
{% if gantry.config.page.head.meta -%}
{% for attributes in gantry.config.page.head.meta -%}
{%- for key, value in attributes %}
<meta name="{{ key|e }}" property="{{ key|e }}" content="{{ value|e }}" />
{% endfor -%}
{%- endfor -%}
{%- endif -%}
{% if gantry.config.page.assets.favicon %}
<link rel="icon" type="image/x-icon" href="{{ url(gantry.config.page.assets.favicon) }}" />
{% endif %}
{% if gantry.config.page.assets.touchicon %}
<link rel="apple-touch-icon" sizes="180x180" href="{{ url(gantry.config.page.assets.touchicon) }}">
<link rel="icon" sizes="192x192" href="{{ url(gantry.config.page.assets.touchicon) }}">
{% endif %}
{% endblock %}
{%- block head_title -%}
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
{%- endblock %}
{% block head_application -%}
{{ gantry.styles('head')|join("n")|raw }}
{{ gantry.scripts('head')|join("n")|raw }}
{%- endblock %}
{% block head_ie_stylesheets -%}
<!--[if (gte IE 8)&(lte IE 9)]>
<script type="text/javascript" src="{{ url('gantry-assets://js/html5shiv-printshiv.min.js') }}"></script>
<link rel="stylesheet" href="{{ url('gantry-engine://css/nucleus-ie9.css') }}" type="text/css"/>
<script type="text/javascript" src="{{ url('gantry-assets://js/matchmedia.polyfill.js') }}"></script>
<![endif]-->
{% endblock -%}
{% block head %}{% endblock %}
{% block head_custom %}
{% if gantry.config.page.head.head_bottom %}
{{ gantry.config.page.head.head_bottom|raw }}
{% endif %}
{% endblock %}
</head>
templates/partials/particle.html.twig — файл для наследования при создания частиц. Блоки описанные в шаблоне (изначально все блоки только определены и в них нет кода):
- stylesheets;
- javascript;
- javascript_footer;
- particle.
Следует отметить что для подключение стилей и скриптов в templates/partials/particle.html.twig и templates/page_head.html.twig используется следующая конструкция.
{# Эта конструкция позволяет подключать скрипты и стили в определённые места#}
{% assets in<b> ‘head’</b> %}{% endassets %}
{{ gantry.styles(<b>'head'</b>)|join("n")|raw }} {# Место подключения для стилей #}
{{ gantry.scripts(<b>'head'</b>)|join("n")|raw -}} {# Место подключения для скриптов #}
где head название блока в который будут подключены стили. Подробнее тут.
Увы но при такой работе со скриптами напрочь пропадает возможность использовать сторонние плагины для их минимализации.
Nucleus — стили (/scss/)
При правильном построении темы, Gantry 5 самостоятельно осуществит подключение файлов стилей описанных в плагине (nucleus.scss и wordpress.scss). Таким образом отпадает необходимость их переопределения в шаблоне (соответственно и подключать их в своём файле стилей не требуется). Но будьте осторожны при переопределении базовых шаблонов поскольку подключение стилей производится непосредственно них.
Nucleus — виды (/views/)
Собраны основные виды. Их можно использовать как примеры для создания собственных шаблонов в теме. При этом во время рендера плагин сначала выполняет поиск файла шаблона в каталоге /views/ темы, а если его не находит то далее поиск идёт в плагине.
Шаблон
Файлы темы
Рассмотрим пример файла index.php из шаблона темы:
<?php
//импортируем twig
use TimberTimber;
$gantry = GantryFrameworkGantry::instance();
$theme = $gantry['theme'];
//в переменную $context будем записывать данные к которым хотим иметь доступ в twig-шаблонах
$context = Timber::get_context();
$context['page_head'] = $theme->render('partials/page_head.html.twig', $context);
$context['posts'] = Timber::get_posts();
//Шаблон который мы хотим использовать для рендера страницы
$templates = ['index.html.twig'];
//если в массиве $templates несколько элементов то будет выбран первый найденный файл
if (is_front_page()) {
array_unshift($templates, 'home.html.twig');
}
Timber::render($templates, $context);
Таким образом описываются все файлы которые может вызвать wordpress. Если посмотреть со стороны то может показаться что теперь классические файлы темы wordpress становятся своеобразными контроллерами в которых мы можем выполнить некоторые действия а после вывести шаблон.
Есть небольшое отличие от классического построения темы. Не всегда требуется создавать footer.php и header.php ведь они могут быть созданы в файлах twig (скажу больше, я вообще не смог создать условия при которых были бы выведены шаблоны из этих файлов).
Виды
Функция Timber::render(); выполняет рендер twig-файла из каталога /views/. Вот простейший пример шаблона:
{# Наследуем шаблон (<b>/плагин/engines/nucleus/views/partials/page.html.twig</b>) #}
{% extends "partials/page.html.twig" %}
{# Переопределяем блок #}
{%- block content -%}
Наш код
{%- endblock -%}
В большинстве случаев, при создании шаблонов страниц, достаточно унаследовать шаблон от базового, но если потребуется то можно создать собственный файл с разметкой.
Описание темы
В директории /gantry/ хранятся технические файлы которые описывают тему.
presets.yaml — файл для описания цветовых схем. В нём можно описать несколько цветовых предустановок темы, для быстрого переключения между ними в админке.
preset1:
# изображение
image: 'gantry-admin://images/preset1.png'
# описание или название
description: GANTRY5_PLATFORM_PRESET1
# основные цвета
colors:
- '#439a86'
- '#354d59'
- '#8f4dae'
# предустановленные стили
styles:
base:
background: '#ffffff'
text-color: '#666666'
accent:
color-1: '#439a86'
color-2: '#8f4dae'
theme.yaml — файл для описания темы.
# думаю этот блок в пояснениях не нуждается
details:
name: Sau
version: "1.0.0"
icon: paper-plane
date: February 7, 2017
author:
name: AkinaySau
email: akinaysau@gmail.com
link: http://a-sau.ru
copyright: (C) 2017 AkinaySau
license: GPLv2
description: Sau Theme
images:
thumbnail: admin/images/preset1.png
preview: admin/images/preset1.png
# основные настройки, не рекомендую менять без крайней необходимости (за исключением параметра textdomain)
configuration:
gantry:
platform: wordpress
engine: nucleus
theme:
base: gantry-theme://common
file: gantry-theme://includes/theme.php
class: GantryFrameworkTheme
textdomain: a_sau
# определение шрифтов
fonts:
roboto:
400: 'gantry-theme://fonts/roboto_regular_macroman/Roboto-Regular-webfont'
500: 'gantry-theme://fonts/roboto_medium_macroman/Roboto-Medium-webfont'
700: 'gantry-theme://fonts/roboto_bold_macroman/Roboto-Bold-webfont'
# определение файлов стилей
css:
compiler: GantryComponentStylesheetScssCompiler
paths:
- gantry-theme://scss
- gantry-engine://scss
files:
- sau
dependencies:
gantry: 5.4.0
#а вот описание этого блока я найти не смог, и на что он влияет не понял. При его редактировании никаких изменений замечено не было.
block-variations:
Box Variations:
box1: Box 1
box2: Box 2
box3: Box 3
box4: Box 4
Effects:
shadow: Shadow 1
shadow2: Shadow 2
rounded: Rounded
square: Square
Utility:
disabled: Disabled
align-right: Align Right
align-left: Align Left
center: Center
full-width: Full Width
equal-height: Equal Height
nomarginall: No Margin
nopaddingall: No Padding
Немного о стилях
При изучении устройства базовой темы hydrogen заметил “правила хорошего тона”. В директории /scss/ следует создавать:
● каталог configuration в котором располагать файлы с определением переменных, которые будут изменяться через админку;
● каталоги для хранения собственных стилей;
● каталог для стилей описывающих частицы. Таблицу стилей для каждой частицы располагать в отдельном файле.
Заключение
Более глубокое погружение в Gantry 5 заставило попробовать использовать YAML и Twig для написания собственного небольшого плагина. О том что из этого получилось я расскажу в следующий раз.
Автор: TutmeeAgency