Разработка темы для Drupal 8

admin пт, 06/10/2016 - 14:26

Для любого сайта очень важен дизайн. Часто разработка темы оформления занимает большую часть работы над сайтом. В этой статье я хочу пошагово описать процесс создания своей темы для Drupal.

Я не буду описывать отличия в темизации Drupal 8 от 7, так как статья рассчитана на новичков в Drupal, а тот кто работал с семеркой и так поймет в чем различия.

Подготовка

Дизайн для темы я быстро нарисовал в Sketch. Это простой блог с сайдбаром справа. Ничего необычного. Макеты дизайна выкладываю.

Скачать .sketch

Для начала нам понадобится:

  1. Установить Drupal 8.
  2. Добавить несколько материалов на сайт или сгенерировать модулем Devel.
  3. Добавить блоки(например "About") для боковой колонки на странице /admin/structure/block/block-content
  4. Сделать меню из нескольких страниц, на странице /admin/structure/menu/manage/main или на редактировании любой ноды.
  5. Отключаем кеш drupal и twig, по инструкции. Если не отключить, придется  вручную очищать, после каждого обновления файлов.

Мы не будем использовать Bootsrap, SASS, Grunt и другие инструменты разработки, чтобы сосредоточится именно на написании темы для друпал. Код я пишу в Atom. Для этого нужно установить расширение для поддержки синтаксиса Twig.

Структура файлов

Первым делом создаем папку для нашей темы в директории /themes/custom/. Назовем тему eight, соответственно полный путь /themes/custom/eight. Что бы друпал увидел тему и она появилась на странице Apparence, нужно добавить файл *.info.yml. у нас это eight.info.yml. Создаем файл eight.info.yml содержащий

name: Eight
description: New theme for Drupal 8.
type: theme
core: 8.x

Здесь мы описываем:

  • name — название темы, так как будет показано в админке.
  • description – описание, тоже для админки
  • type – пишем theme, потому что это тема оформления
  • core – версия друпала

После этого тема должна быть доступна на странице /admin/appearance, но пока включать ее не надо.

 

Если тема не появилась на странице, проверьте правильно ли указаны права на файлы

Дальше добавляем папки для стилей (/css), джаваскрипта (/js),шаблонов страниц (/templates), изображений (/images) и файл eight.libraries.yml. Для подключения своих css и js файлов нужно их описать в eight.libraries.yml

Drupal 8 Theme files

Для того что бы на сайте показывалось содержимое, нужен файл page.html.twig. Создадим его в папке templates. Там мы будем держать все файлы twig.

Добавим в него одну строку 

{{ page.content }}

Этого достаточно что бы показать область с контентом. Можем включить и установить по умолчанию шаблон. Если перейти на главную страницу, будут видны добавленные на сайт ноды, без оформления.

Drupal theme tutotrial

Теперь добавим css и js. Создаем файл style.css в папке css. В нем можно написать

body {
   font-size: 16px;
   font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
   font-style: normal;
   font-weight: 400;
   background: #eee;
}

В scripts.js 

(function ($, Drupal) {

  "use strict";

  Drupal.behaviors.eight = {
    attach: function (context) {

    }
  };

})(jQuery, Drupal);

Объявляем их в eight.libraries.yml

global-styling:
  version: VERSION
  css:
    theme:
      css/style.css: {}
  js:
    js/scripts.js: {}

Это значит что мы создали библиотеку "global-styling" содержащую файл style.css и scripts.js Подключаем ее, normalize.css(он уже есть в друпале) и остальные стандартные элементы  в info.yml

name: Eight
description: New theme for Drupal 8.
type: theme
core: 8.x
libraries:
  - eight/global-styling
  - core/normalize
  - classy/base
  - core/jquery
  - core/drupal.ajax
  - core/drupal
  - core/drupalSettings
  - core/jquery.once

Чистим кеш (config/development/performance) и обновляем главную страницу. Шрифт изменился, поменялись отступы – значит css подключилось к шаблону. 

Drupal theme guide

Если тема не появилась на странице, проверьте правильно ли указаны права на файлы

Верстка

Минимальный набор файлов для темы мы сделали и подключили, теперь можно заняться версткой. Дизайн у нас адаптивный, так что начнем с мобильной версии. Верстать я решил используя Flexbox, он уже поддерживается во всех браузерах

Теперь давайте определим все регионы на сайте в eight.info.yml. Я сделал схему расположения регионов.

В мобильной версии все блоки региона Header Right, будут в одном "гамбургер меню", мы его сделаем простым скриптом.

Перечисляем регионы в eight.info.yml

regions:
  header_left: 'Header Left'
  header_right: 'Header Right'
  content: 'Content'
  sidebar_first: 'Sidebar first'
  footer: 'Footer'

Теперь настроим блоки для отображения в сайдбаре и футере на странице Administration / Structure / Block layout. Например блок About поставим в Sidebar и меню в Right Header.

Пишем в page.html.twig

<header>
    <div class="header">
        {{ page.header }}
    </div>
</header>
<div class="main-wrapper">
    <div class="content-column">
        {{ page.content }}
    </div>
    <div class="aside">
        aside1
    </div>
</div>

и в style.css

header {
    height: 3em;
    background: #fff;
    border-bottom: 1px solid #eee;
}
.main-container {
    display: flex;
    flex-flow: row wrap;
    margin: 0 5%;
}
.content-column,
.aside {
    flex: 1 100%;
}

Обновляем страницу сайта. Как видим добавился хедер и сайдбар, пока он не сбоку , а под контентом, потому что сначала делаем мобильную версию. 

Добавляем адаптивность и ограничиваем ширину контейнера.

/*Layout*/

.container {
  display: flex;
  flex-flow: row wrap;
  margin: 0 5%;
}

.content-column, .sidebar {
  flex: 1 100%;
}


@media all and (min-width: 600px) {
  .content-column { flex: 1 65%}
	   .sidebar { flex: 1 33%;
	   margin-left: 1%; }
}

@media all and (min-width: 1200px) {
   .container {
     width: 1140px;
   }
}

Теперь на десктопе и планшете должно быть 2 колонки, на мобильном — 1. Для простого блога этого достаточно.

Добавим еще в style.css оформление для сайдбара, и сделаем строку с датой в статье серого цвета.

/*Sidebar*/

.sidebar {
  margin-top: 2em;
}

.sidebar #block-about {
  padding: 20px;
  background: #eee;
}

.sidebar h2 {
  margin: 0;
  font-size: 1.5em;
}


/*Article */

article footer {
  color: #666;
  font-size: 14px;
}

Header и Footer

После включения меню, шапка отображается криво. Сделаем сначала меню для мобильной версии. Добавим в шапку возле меню блок с гамбургер иконкой. Пишем css.

/* Hamburger icon */

.hamburger {
  position: relative;
  overflow: hidden;
  margin: 0;
  padding: 0;
  width: 32px;
  height: 32px;
  font-size: 0;
  text-indent: -9999px;
  appearance: none;
  box-shadow: none;
  border-radius: none;
  border: none;
  cursor: pointer;
  transition: background 0.3s;
  background: transparent;
}

.hamburger:focus {
  outline: none;
}

.hamburger span {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 6px;
  background: #000;
}

.hamburger span::before,
.hamburger span::after {
  position: absolute;
  display: block;
  left: 0;
  width: 100%;
  height: 6px;
  background-color: #000;
  content: "";
}

.hamburger span::before {
  top: 10px;
}

.hamburger span::after {
  bottom: -20px;
}


/*Responsive header*/

.header {
  padding: 20px 0;
}

.header--right {  /*Hide header on mobile*/
    display: none;
}

/*Menu*/

.header--right  ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

.header--right  li {
  list-style: none;
}

@media only screen and (min-width: 959px) {  /*Hide menu icon on desktop */
  .hamburger {
    display: none;
  }

  .header--right {  /*Hide header on mobile*/
      display: flex;
  width: auto;
  }

  .header--right  li {
    display: inline;
    margin-left: 2em;
  }

}

И в scripts.js пишем:

(function ($, Drupal) {

  "use strict";

  Drupal.behaviors.eight = {
    attach: function (context) {
      $(document).ready(function() {


        $( ".hamburger" ).click(function() {
          $( ".header--right" ).slideToggle( "slow");
        });


  	  });
    }
  };

})(jQuery, Drupal);

А с футером вообще все просто, только css добавим:

/*Footer*/

.footer {
  padding: 40px 0;
  margin-top: 40px;
background: #F5F5F5;
color: #666;
font-size: 0.9em;
}


.footer a {
  color: #999;
}

Заключение

Мы сделали очень простую тему, её уже можно даже использовать на рабочих сайтах, но еще много не сделано и не соответствует дизайну. В следующей статье доделаем наш шаблон и ознакомимся с другими функциями CMS Drupal.