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

Опубликовано 2015.04.04 в разделе Drupal.

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

Panels + Statistics + Drupal 8

Опубликовано 2016.09.14 в разделе Drupal.

Модуль статистики(тот что в ядре) ""цепляется за ноды в hook_ENTITY_TYPE_view. Если вы выводите ноды через панели(Pages) - то этот хук соответственно не будет работать. Разрулить проблему можно если самому подрубить библиотеку модуля statistics к страницам материалов. Я сделаю это в hook_page_attachments. Код хука
  1. /**
  2.  * Implements hook_page_attachments().
  3.  */
  4. function module_page_attachments(array &$page) {
  5. $request = \Drupal::request()->getRequestUri();
  6. $nid = NULL;
  7. if (substr($request, 0, 6) == '/node/') {
  8. $nid = substr($request, 6);
  9. } else {

DataBase API в Drupal 8

Опубликовано 2016.09.14 в разделе Drupal.

API в восьмёрке очень похоже на API.
  1. //не забываем
  2. use Drupal\Core\Database\Database;
  3. use Drupal\Core\Database\Query\Select;
  4.  
  5. //далее просто пример моего запроса
  6. $connection = Database::getConnection();
  7. $sql = new Select('node__field_tags', 'ft', $connection);
  8. $sql->condition('field_tags_target_id', $tids, 'in');
  9. $sql->leftJoin('taxonomy_term_field_data', 'tfd', 'tfd.tid=ft.field_tags_target_id');
  10. $sql->leftJoin('node_field_data','nfd', 'nfd.nid=ft.entity_id');
  11. $sql->fields('ft', array('field_tags_target_id', 'entity_id'));
  12. $sql->fields('tfd', array('name'));

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

Опубликовано 2016.09.12 в разделе Drupal.

Информацию о шаблонах из интерфейса вьюса успешно выпилили(надеюсь не навсегда). Чтобы сделать шаблон для поля - добавьте следующий хук:
  1. function template_preprocess_views_view_field(&$vars) {
  2. $field_id = $vars['field']->options['id'];
  3. $views_name = $vars['view']->id();
  4. $display_name = $vars['view']->getDisplay()->display['id'];
  5. $vars['theme_hook_original'] = 'views_view_field__' . $views_name . '__' . $display_name . '__' . $field_id;
  6. }
для полей
  1. function template_preprocess_views_view_fields(&$vars) {
  2. $views_name = $vars['view']->id();

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

Опубликовано 2016.09.09 в разделе Drupal.

В файлах module_name.libraries.yml css подключается немного сложнее, чем js. Пример:
  1. map_render:
  2. js:
  3. js/infobox.js: {}
  4. js/markerclusterer.js: {}
  5. js/map_render.js: {}
  6. css:
  7. base:
  8. css/map_base.css: {}
  9. layout:
  10. css/map_layout.css: {}
  11. component:
  12. css/map_component.css: {}
  13. state:
  14. css/map_state.css: {}
  15. theme:
  16. css/map_theme.css: {}
Конкретно в этом случае все css подключатся в порядке добавления, одна происходит это за счёт веса их родительского раздела. Веса следующие:

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

    Опубликовано 2016.09.08 в разделе Drupal.

    В семёрке в функцию l можно было передать третьим аргументом 'html' => TRUE В восьмёрке этого нет. Вместо этого анкор ссылки надо превратить в Markup. Простой пример:
    1. //не сработает
    2. $render_image = '<img src="/my-image.png" />';
    3. $link = Link::fromTextAndUrl($render_image, $url)->toRenderable();
    4.  
    5. //сработает
    6. $render_image = Markup::create('<img src="/my-image.png" />');
    7. $link = Link::fromTextAndUrl($render_image, $url)->toRenderable();

    Команды в Twig

    Опубликовано 2016.09.08 в разделе Разное.

    Аналог print_r для шаблона twig
    1. {{ dump(array) }}
    Для обхода массива - аналог foreach Я сразу обхожу вложенный ассоциативный массив articles
    1. {% for article_i,article in articles %}
    2. Article key : {{ article_i }}
    3. Article Value : {{ article }}
    4. {% for key,value in article %}
    5. Key : {{ key }}
    6. Value : {{ value }}
    7. {% endfor %}
    8. {% endfor %}
    Закомментировать код
    1. {# code #}
    php`шный !empty
    1. {% if field is not empty %}
    2. {{ field }}
    3. {% endif %}

    Программно вывести пресет изображения в Drupal 8

    Опубликовано 2016.09.08 в разделе Drupal.

    Предположим что нам известен id файла изображения.
    1. //не забываем
    2. use Drupal\file\Entity\File;
    3.  
    4.  
    5. $file = File::load($image_id);
    6. $variables = array(
    7. 'style_name' => 'thumbnail',
    8. 'uri' => $file->getFileUri(),
    9. );
    10. $image = \Drupal::service('image.factory')->get($variables['uri']);
    11. if ($image->isValid()) {
    12. $variables['width'] = $image->getWidth();
    13. $variables['height'] = $image->getHeight();
    14. }
    15. else {
    16. $variables['width'] = $variables['height'] = NULL;
    17. }
    18. $preset = [
    19. '#theme' => 'image_style',
    20. '#width' => $variables['width'],

    MENU_CALLBACK в Drupal 8

    Опубликовано 2016.09.07 в разделе Drupal.

    Бывает что нужно вывести на страницу только конкретный текст, без всей обёртки страницы. Если не использовать hook_menu в Drupal 8, то в методе контроллера, отвечающего за рендер страницы следует писать так:
    1. //с обёрткой
    2. return [
    3. '#type' => 'markup',
    4. '#markup' => $this->t('Content of page')
    5. ];
    6.  
    7. //без обёртки(аналог MENU_CALLBACK)
    8. return new Response('Content of page');
    9.  
    10. //тоже самое, только будет жёстко кэшироваться.
    11. return new HtmlResponse('Content of page');
    12.  
    13. //Не забываем
    14. use Symfony\Component\HttpFoundation\Response;