Создание сайта на Drupal 8

В этой серии статей мы разберем основы Drupal 8, начиная от установки и заканчивая небольшим практическим заданием. На данный момент(апрель 2015) восьмёрка ещё сыровата и модулей для неё мало, но знакомиться с ней уже давно пора.
Если вы ещё не работали с Drupal - лучше начинайте с 8, пока научитесь и поймёте что там к чему - система будет гораздо стабильнее.

Разработка модулей для Drupal 7

В этом цикле статей я расскажу вам об основных аспектах разработки модулей для Drupal 7.

Подружить Admin menu и Toolbar

Чтобы подружить эти 2 модуля - включайте:

  • Administration menu
  • Administration menu Toolbar style
  • Toolbar

Создавайте свой модуль и в нём пропишите следующий хук:

function mymodule_theme_registry_alter(&$theme_registry) {
  $theme_registry['toolbar']['path'] = $theme_registry['toolbar']['theme path'] = drupal_get_path('module', 'mymodule');
}

Затем в папку модуля положите файл с именем toolbar.tpl.php и содержимым:
<div id="toolbar" class="<?php print $classes; ?> clearfix">

Colorbox node + Webform + Redirect

Если поставить модули colorbox, colorbox_node и webform - то можно чудесным образом выводить форму в модульном окне.
Для этого создавайте вебформу, ставьте чекбокс "Доступен как блок"
Затем в нужном месте прописывайте ссылку

<a class="link colorbox-node" href="/node/304?width=420&height=150" >Закажи звонок!</a>

Такая ссылка откроет вебформу(nid=304) в колорбоксе размерами 420х150 пикселей.
Однако, если этой форме добавить редирект после сабмита - то он не сработает. Для этого добавьте get параметр destination
 

Panels + Statistics + Drupal 8

Модуль статистики(тот что в ядре) ""цепляется за ноды в hook_ENTITY_TYPE_view.
Если вы выводите ноды через панели(Pages) - то этот хук соответственно не будет работать.
Разрулить проблему можно если самому подрубить библиотеку модуля statistics к страницам материалов. Я сделаю это в hook_page_attachments.
Код хука

/**
 * Implements hook_page_attachments().
 */
function module_page_attachments(array &$page) {
  $request = \Drupal::request()->getRequestUri();
  $nid = NULL;
  if (substr($request, 0, 6) == '/node/') {
    $nid = substr($request, 6);
  } else {

DataBase API в Drupal 8

API в восьмёрке очень похоже на API.

//не забываем
use Drupal\Core\Database\Database;
use Drupal\Core\Database\Query\Select;
 
//далее просто пример моего запроса
$connection = Database::getConnection();
$sql = new Select('node__field_tags', 'ft', $connection);
$sql->condition('field_tags_target_id', $tids, 'in');
$sql->leftJoin('taxonomy_term_field_data', 'tfd', 'tfd.tid=ft.field_tags_target_id');
$sql->leftJoin('node_field_data','nfd', 'nfd.nid=ft.entity_id');
$sql->fields('ft', array('field_tags_target_id', 'entity_id'));
$sql->fields('tfd', array('name'));

Получить текущий URL в Drupal 8

Тэги:

Код такой выведет текущий URL, например алиас ноды:

$current_uri = \Drupal::request()->getRequestUri();

Поместить его можно например в hook_preprocess_page

Шаблон для field и fields во вьюсе для Drupal 8

Информацию о шаблонах из интерфейса вьюса успешно выпилили(надеюсь не навсегда).
Чтобы сделать шаблон для поля - добавьте следующий хук:

function template_preprocess_views_view_field(&$vars) {
  $field_id = $vars['field']->options['id'];
  $views_name = $vars['view']->id();
  $display_name = $vars['view']->getDisplay()->display['id'];
  $vars['theme_hook_original'] =  'views_view_field__' . $views_name . '__' . $display_name . '__' . $field_id;
}

для полей
function template_preprocess_views_view_fields(&$vars) {
  $views_name = $vars['view']->id();

Подключение css в Drupal 8

В файлах module_name.libraries.yml css подключается немного сложнее, чем js.
Пример:

map_render:
  js:
    js/infobox.js: {}
    js/markerclusterer.js: {}
    js/map_render.js: {}
  css:
    base:
      css/map_base.css: {}
    layout:
      css/map_layout.css: {}
    component:
      css/map_component.css: {}
    state:
      css/map_state.css: {}
    theme:
      css/map_theme.css: {}

Конкретно в этом случае все css подключатся в порядке добавления, одна происходит это за счёт веса их родительского раздела. Веса следующие:

Ссылка с html кодом в анкоре

Тэги:

В семёрке в функцию l можно было передать третьим аргументом 'html' => TRUE
В восьмёрке этого нет. Вместо этого анкор ссылки надо превратить в Markup.

Простой пример:

//не сработает
$render_image = '<img src="/my-image.png" />';
$link = Link::fromTextAndUrl($render_image, $url)->toRenderable();
 
//сработает
$render_image = Markup::create('<img src="/my-image.png" />');
$link = Link::fromTextAndUrl($render_image, $url)->toRenderable();