Урок 1. Введение

Что нового в Drupal 8. Урок 1.

Drupal 7, помимо своих возможностей и гибкости, в то же время обладает серьезными ограничениями, включая недоработанное Entity API, отсутствие разделения между контентом и конфигурацией, которое в свою очередь приводит к трудоемкому процессу деплоймента, отсутствие разделения логики и представления в темизации и пр. Для всех этих проблем есть решение в виде контрибных модулей, но в большинстве случаев эти решения сырые. CMF требовала серьезных изменений в ядре[1].

Содержание

Введение

Процесс работы над восьмой версией был продолжительным и болезненным. Начав старт с далекого 2011 года дата релиза постоянно откладывалась и сдвигалась. Ниже приведен график работы над восьмой версией с ключевыми датами[2].
drupal 8 releasesДля примера график релизов Друпала с версии 1.0 по 7.0 проходил в таких временных интервалах[3].
drupal релизы с версии 1.0 до 7.0

Что нового в Drupal 8

Данный список содержит основные изменения. Ознакомиться с полным списком можно по ссылке[4].

Использование компонентов Symfony2

В ядре произошло достаточно большое количество изменений. Одно из главных изменений, конечно же, — это переход к ООП и использование компонентов Symfony2. Полный переход на ООП не завершен в восьмой версии, поэтому в ядре еще используется процедурный подход и хуки. Перейти полностью на ООП нам обещают в 9 версии.
Ниже приведен неполный список компонентов Symfony2, которые используются в восьмерке:

  • HttpKernel — предоставляет структурированный процесс для преобразования запроса в ответ с помощью EventDispatcher;
  • HttpFoundation — преобразовывает все, что связано с HTTP при запросе и ответе — в объекты;
  • Routing — преобразовывает HTTP запрос в вызов определенной функции, подобно hook_menu;
  • ClassLoader — используется для загрузки классов по мере необходимости;
  • DependencyInjection или Service Container — позволяет сделать классы независимыми и доступными для повторного использования, юнит-тестирования;
  • EventDispatcher — реализует паттерн Посредник (Mediator). Делает тоже самое что и система хуков, но на данный момент, не заменяет их полностью;
  • Yaml — позволяет работать с форматом YAML;
  • Serializer — преобразовывает объекты в определенный формат и обратно;
  • Translation — система переводов;
  • Process — используется для выполнения в субпроцессе, команд из консоли;
  • Validator — компонент для проверки значений;

YAML на смену .info файлам

В Drupal 8 .info, а также конфигурационные файлы представлены в формате YAML[5].

YAML (рекурсивный акроним YAML Ain't Markup Language — «YAML — Не язык разметки») — «дружественный» формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования.

Ниже приведены примеры содержания .info и .info.yml файлов на примере контрибного модуля admin_menu.

D7 D8
1
2
3
4
5
6
7
8
name = Administration menu
description = 'Provides a dropdown menu to
most administrative tasks and other common
destinations (to users with the 
proper permissions).'
package = Administration
core = 7.x
configure = admin/config/administration/admin_menu
1
2
3
4
5
6
7
8
name: 'Administration menu'
type: module
description: 'Provides a dropdown menu to most
administrative tasks and other common destinations
(to users with the proper permissions).'
package: Administration
core: 8.x
configure: admin/config/admin/admin_menu

Подключение файлов и зависимостей теперь также согласно синтаксису YAML.

1
2
3
4
5
6
7
8
files:
  - example.module
  - example.install
  - includes/example.inc
 
dependencies:
  - node
  - block

Удалены функции drupal_add_css(), drupal_add_js() and drupal_add_library()

В Drupal 7 эти функции использовались для подключения js, css, библиотек к странице. Помимо этого в D7 существует альтернативный способ через #attached. В Drupal 8 использование #attached в рендерном массиве — это единственный способ подключить js и css на конкретной странице. Кроме этого есть возможность подключать файлы через .info.yml файл, но об этом позже.
Примеры подключения js, css, библиотеки в 7 и 8 версиях приведены в таблице ниже.

D7 D8
CSS
1
2
$path = drupal_get_path('module', 'example');
drupal_add_css($path . '/example.css');
1
2
3
4
5
6
7
8
$path = drupal_get_path('module', 'example');
$example = array(
  '#attached' => array(
    'css' => array(
      $path . '/css/example.css' => array(),
    ),
  ),
);
JS
1
2
$path = drupal_get_path('module', 'example');
drupal_add_js($path . '/example.js');
1
2
3
4
5
6
7
8
$path = drupal_get_path('module', 'example');
$example = array(
  '#attached' => array(
    'js' => array(
      $path . '/js/example.js' => array(),
    ),
  ),
);
Library
1
drupal_add_library('example', 'drag-and-drop');
1
2
3
4
5
6
7
$example = array(
  '#attached' => array(
    'library' => array(
      array('example', 'drag-and-drop'),
    ),
  ),
);

Роутинговая система Symfony вместо hook_menu()

В восьмерке роутинговая система работает с компонентом Symfony HttpKernel. Упрощенная схема, показывающая взаимосвязи между компонентами, приведена ниже
drupal 8 схема роутинга
Роутинговая система отвечает за соответствие путей и контролеров (аналог page callbacks в 7-ой версии). Дополнительная информация также может быть предана контроллеру.
Ключевые отличия:

  • Роуты (маршруты) теперь определяются в файле module.routing.yml, в формате YAML;
  • Роуты идентифицируется машинным именем. Машинные имена должны быть в формате module_name.sub_name;
  • Каждый маршрут состоит из пути, например, /admin/content/book, включая начальный слэш.
  • Ключ _controller ссылается на методы конкретных классов. Класс будет инстанцирован и нужный метод будет вызван. Например
    1
    
    _controller: \Drupal\example\Controller\ExampleClass::myMethod
  • Возможно указать несколько пермишенов для данного пути. Для использования AND логики, пермишены должны быть разделены запятыми, пример:
    1
    
    _permission: 'access content,administer blocks'

    Для использования логики OR пермишены должны быть склеены знаком +, пример:

    1
    
    _permission: ‘access content+administer blocks’.

    Важное замечание: пробелов между пермишенами быть не должно.

Замена Page callback на контроллер

hook_menu() колбэки по всему друпаловскому ядру были заменены на классы контроллеров.
Как это было в Drupal 7 и выглядит в Drupal 8

D7 D8
example.module example.routing.yml
1
2
3
4
5
6
7
8
9
10
11
function example_menu() {
  $items['/example'] => array(
    'title' => 'This is example page',
    'page callback' => 'example_page',
    'access callback' => 'user_access',
    'access arguments' => array('access content'),
    ),
  );
 
return $items;
}
1
2
3
4
5
6
7
example.content:
 path: '/example'
 defaults:
   _controller: '\Drupal\example\Controller\MyController::content'
   _title: 'This is example page'
 requirements:
   _permission: 'access content'
example.module /modules/custom/example/src/Controller/MyController.php
1
2
3
4
5
function example_page() {
  return array(
    '#markup' => t('Example.'),
  );
}
1
2
3
4
5
6
7
8
9
namespace Drupal\example\Controller;
 
class MyController {
 public function content() {
   return [
     '#markup' => t('Example'),
   ];
 }
}

Система сервисов и плагинов.

Плагины— это небольшая часть функционала, которая может быть заменена, переиспользована. Плагины определяются модулями и имеют общий интерфейс, но разные реализации. В модулях могут быть определены плагины различных типов, равно как и в других модулях могут быть определены собственные плагины конкретного типа [6].
Хороший пример плагинов приведен из официальной документации — модификация картинок. В общем, трансформация картинок — это масштабирование, обрезка, ресайзинг и т.д. Каждая трансформация работает по одному и тому же принципу: получает изображение, производит наложение эффекта, возвращает измененную картинку. Однако каждый эффект различен.
Сервисы— имеют такую же функциональность, что и плагины, но являются взаимозаменяемыми, отличаясь лишь внутренней реализацией. Пример — кеш. Кеш должен обладать методами: get(), set(), expire(). Пользователь просто ожидает получить кеш и один кеш-объект может быть заменен другим без какой-либо функциональной разницы. Однако внутренние механизмы этих методов могут сильно отличаться.

Новые типы полей

Drupal 8 расширяет возможности системы структуры контента путем включения нескольких типов полей в ядро и позволяет прикреплять поля для нескольких типов материалов.
Новые типы:

  • ссылка на сущность (entity reference);
  • ссылка (link);
  • дата (date);
  • адрес электронной почты (email);
  • телефон (telephone number);

Комментарии теперь тоже являются полем.
drupal 8 новые типы

Views и Migrate в ядре

Модуль Views и Migrate теперь встроены в ядро. Фронтальная страница со списком контента это тоже вьюха, как и несколько страниц администрирования. Из коробки у нас есть простой процесс создания собственных страниц администрирования, контента, а также настройки уже существующих, фильтров, действий и т. д. Drupal 8 включает в себя инструменты импорта, которые позволяют импортировать контент из Drupal 6 или Drupal 7 сайтов в новую версию.

Новый подход к редактированию контента

С новой функциональностью встроенного редактора CKEditor WYSIWYG, редактировать контент в Drupal стало очень просто. Разработчики также переработали форму редактирования контента с двумя колонками, так что теперь вы можете сосредоточиться на том, что важно.

  • Конфигурация WYSIWYG стало проще с учетом требований веб-безопасности.
  • В месте редактирования контента теперь нет необходимости использовать полную форму редактирования, что несомненно стало удобно.

быстрое редактирование

Twig в ядре

Twig — компилирующий обработчик шаблонов с открытым исходным кодом, написанный на языке программирования PHP. Синтаксис языка шаблонов Twig берёт начало от движков шаблонов Jinja и Django. Идею данного шаблонизатора развивает и поддерживает Fabien Potencier, ведущий разработчик и идеолог фреймворка Symfony, в котором Twig используется по умолчанию.[7]

Ядро Twig полностью интегрировано с Drupal 8 и определяет новую удобную логику для построения различных тем.
Преимущества Twig по сравнению с другими template движками[8]:

  • Быстрый. Твиг компилирует шаблоны в простой оптимизированный PHP код.
  • Безопасный. Твиг имеет режим песочницы для запуска подозрительного кода шаблона. Это позволяет использовать Твиг в шаблонах приложений, где пользователи могут вносить изменения в код шаблона.
  • Гибкий. Твиг обладает гибким инструментом лексического анализа и парсером. Это позволяет разработчику определять свои собственные тэги и фильтры, а также создавать свой собственный DSL (язык программирования, специализированный для конкретной области применения).

Backbone и Underscore.js в ядре

Backbone — JavaScript-библиотека, основанная на шаблоне проектирования Model-View-Presenter (MVP), предназначена для разработки веб-приложений с поддержкой RESTful JSON интерфейса. Backbone — очень лёгкая библиотека, но для работы необходима библиотека Underscore.js, а для поддержки REST API и работы с DOM элементами рекомендуется подключить jQuery-подобную библиотеку: jQuery или Zepto.[9]

Backbone был выбран потому, что на текущий момент имеет огромное комьюнити и как наиболее стабильный.

Underscore — библиотека JavaScript, реализующая дополнительную функциональность для работы с массивами, объектами и функциями, изначально отсутствующую в javascript, но имеющую аналоги в других языках. Библиотека умеет делегировать вызовы, если какая-то функциональность реализована разработчиками браузеров.[10]

Конфигурационная система

Добавлена централизованная система экспорта/импорта. Данная система основана на файлах в формате YAML, что позволяет проще импортировать/экспортировать изменения в конфигурации, в том числе новые типы материалов, поля, вьюхи и т.д. Отличная замена модулю Features. Меня поймут те, которым приходилось хоть раз мержить фичи, бороться с overriden и rebuilding статусами. Новый конфигурационный подход также позволяет вам использовать систему контроля версий для ваших конфигов.

PHPunit тесты

Drupal 8 также включает в себя PHPUnit для более быстрого и целенаправленного тестирования. Многочисленные тесты были сконвертированы или заново написаны на PHPUnit (SimpleTest все еще является частью системы).

Расширены возможности мультиязычности

При инсталляции Drupal 8 на самом первом шаге у вас есть все возможности для переводов, вплоть до переводов вьюх и полей изображений. При выборе не английского языка переводы подгружаются автоматически без дополнительных действий.

  • Перевод всех слов в системе с помощью встроенного пользовательского интерфейса стал более удобен.
  • Создание страниц с помощью Views с фильтрацией языка и видимостью блоков.
  • Получение обновления переводов автоматически от сообщества Drupal.

Сокращение модулей ядра

Из ядра были "выпилены" следующие модули:

  • Blog
  • Dashboard
  • List
  • OpenID
  • Overlay
  • PHP filter
  • Trigger
  • Poll
  • Profile и т.д.

Некоторые из них были удалены по причине неиспользования (или редкого использования) в качестве базовых компонентов на большинстве Drupal сайтов, некоторые по причинам безопасности (PHP filter). Это не значит, что этих модулей больше нет и они не будут поддерживаться. Они выведены в качестве отдельных контрибных модулей и также доступны.

Серверные и браузерные требования

Drupal 8 работает со следующими версиями браузеров:

  • Internet Explorer 9.x и поздние версии
  • Firefox 5.x и поздние версии
  • Opera 12 и поздние версии
  • Safari 5.x и поздние версии
  • Google Chrome

Восьмерка работает с любым веб сервером, который поддерживает PHP. Наиболее распространенные:

  • Apache — будет работать на Apache 2.x, размещенного на UNIX / Linux, OS X или Windows.
  • Nginx — будет работать на старых версиях Nginx (0.7.x, 0.8.x, 1.0.x, 1.2.x), стабильных 1.8.x и 1.9.x размещенных на UNIX / Linux, OS X или Windows.
  • Microsoft IIS — будет работать с IIS 5, IIS 6, или IIS 7 если PHP сконфигурирован корректно.

Более подробную информацию вы можете найти по ссылке[11].

Структура папок

Структура папок сайта также значительно изменилась. После установки Drupal 8 структура папок будет следующей:
drupal 8 структура папок

  • core — содержит модули, файлы ядра. Вносить что либо в этой папке категорически нельзя по понятным причинам;
  • modules — папка контрибных, кастомных модулей. Именно сюда по пути modules/custom будут расположены кастомные модули, а по modules/contrib - контрибы;
  • profiles — содержит папку с кастомными профилями;
  • sites — содержит папки сайтов для мультисайтинга, настройки;
  • themes — директория кастомных тем;
  • vendor — содержит компоненты симфони, библиотеки, утилиты, конфиги и т.д., необходимые для работы сайта;

Домашнее задание

Задание на первый урок простое. Развернуть Drupal 8 используя https://simplytest.me/
simplytestme
После установки сайта, ознакомиться с основными разделами, "походить" по меню, посоздавать статьи, позаливать картинки. На данном этапе нет необходимости заморачиваться над установкой и разворачивать сайт локально.

Дополнительная информация по статье

  1. http://buytaert.net/why-the-big-architectural-changes-in-drupal-8 - Дрис об архитектурных изменения в Drupal 8.
  2. https://www.drupal.org/core/dev-cycle - ключевые даты работы над 8 версией.
  3. http://www.slideshare.net/WEBSOLUTIONSHR/history-of-drupal-from-drop-10-to-drupal-8-59198423 - история Друпала от 1.0 до 8.0.
  4. http://cgit.drupalcode.org/drupal/plain/core/CHANGELOG.txt - лог изменений Drupal.
  5. https://ru.wikipedia.org/wiki/YAML - YAML на wiki.
  6. https://www.drupal.org/docs/8/api/plugin-api/plugin-api-overview - Plugin API.
  7. https://ru.wikipedia.org/wiki/Twig - Twig на wiki.
  8. http://twig.sensiolabs.org/ - официальный сайт Twig.
  9. https://ru.wikipedia.org/wiki/Backbone.js - о Backbone на wiki.
  10. https://ru.wikipedia.org/wiki/Underscore - о Underscore на wiki.
  11. https://www.drupal.org/docs/8/system-requirements/web-server - серверные требования для Drupal 8.
  12. Версии программных продуктов, используемых в статье: Drupal 8.2.4

3 Комментария

Аватар пользователя AK

Спасибо за обзор. Очень

Спасибо за обзор. Очень хорошее начинание, ввиду того, что очень мало структурированной информации по API Drupal 8.

Аватар пользователя Алексей

По поводу drupal_add_library

По поводу drupal_add_library
С модулями все ясно, но как быть, если нужно библиотеку (например jquery-ui) непосредственно в теле ноды подключить? В 7-ке я это делал drupal_add_library('system','ui-tabs'). КАК это сделать в 8-ке - не доходмит пока что...
Заранее спасибо.

Аватар пользователя nightdevel

Постараюсь ответить на ваш

Постараюсь ответить на ваш вопрос. Для подключения библиотеки на странице ноды вам необходимо использовать hook_preprocess_HOOK() (в данном случае MYMODULE_preprocess_node(&$vars)). Хук должен быть расположен в файле MYMODULE.module с приблизительно следующим содержимым

1
2
3
4
5
6
/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_node(&$variables) {
  $variables['content']['#attached']['library'][] = 'core/jquery.ui.tabs';
}

Более детально работу с библиотеками (создание/подключение) планирую рассмотреть в 7 уроке.