xandeadx.ru Блог музицирующего веб-девелопера

DrupalАвтоматическое удаление файлов после удаления сущности

В восьмёрке по умолчанию после удаления сущности не удаляются файлы, залитые в поля типа File. Они не удаляются ни сразу, ни по крону, так как статус файла в таблице file_managed остаётся 1. В версии 8.4 появилась опция make_unused_managed_files_temporary, при включении которой файлы помечаются как временные и удаляются по прошествии 6 часов, однако отредактировать эту опцию из админки нельзя. Включить можно либо с помощью drush:

vendor/bin/drush config-set file.settings make_unused_managed_files_temporary 1 -y

DrupalОтключить автоматический аплоад файлов у определённого поля

Опубликовано в

Способ из js отключить автозагрузку файлов:

(function ($, Drupal) {
  Drupal.behaviors.modulename = {
    attach: function attach(context, settings) {
      var $inputWithNoAutoupload = $('input[type="file"].my-file-input', context);
      if ($inputWithNoAutoupload.length) {
        $inputWithNoAutoupload.removeOnce('auto-file-upload').off('.autoFileUpload');
        Drupal.behaviors.fileButtons.detach(context, settings, 'unload');
      }
    }
  };
})(jQuery, Drupal);

Скрипт должен подключаться после core/modules/file/file.js

DrupalОтсылка на сервер дополнительных данных в системном автокомплите

Опубликовано в

Системный автокомплит умеет отправлять на сервер только введённый текст. Послать вместе с текстом какие-то данные, например значение поля или js-переменной, нельзя.

Решение с подменой функции Drupal.ACDB.prototype.search:

autocomplete-fix.js

(function ($) {
  // Override Drupal.ACDB.prototype.search
  Drupal.ACDB.prototype.search = function (searchString) {
    var db = this;
    this.searchString = searchString;
 
    searchString = searchString.replace(/^\s+|\.{2,}\/|\s+$/g, '');

DrupalАнатомия блоков

Опубликовано в

Block API в восьмёрке подверглось значительным изменениям и усложнениям. Теперь, помимо функционала в ядре, есть три модуля для работы с блоками:

  1. block — основа для программного создания блоков и вывода их на странице
  2. block_content — позволяет из админки управлять пользовательскими блоками, их типами и полями
  3. block_place (скрытый модуль) — расширенный интерфейс управления блоками в духе Panels

DrupalПодмена административного меню

Опубликовано в

Код для роли rid=4 подменяет административное меню management на menu-example:

/**
 * Implements hook_admin_menu_output_alter().
 */
function MODULENAME_admin_menu_output_alter(&$content) {
  if (user_has_role(4)) {
    // Remove old links
    $content['menu'] = array_diff_key($content['menu'], array_flip(element_children($content['menu'])));
    // Add new links
    $content['menu'] += admin_menu_links_menu(admin_menu_tree('menu-example'));
  }
}

DrupalРазрешаем открывать в Colorbox инлайновый картинки в тексте ноды

Опубликовано в

В седьмом друпале в настройках Colorbox была опция "Enable Colorbox load", позволяющая ссылкам с классом colorbox-load открываться в колорбоксе. В восьмой версии эту опцию удалили, но её достаточно просто вернуть с помощью кода:

/**
 * Preprocess variables for page.html.twig.
 */
function THEMENAME_preprocess_page(&$variables) {
  \Drupal::service('colorbox.attachment')->attach($variables);
}

Сбрасываем кэш.

DrupalДобавить в хлебные крошки заголовок текущей страницы

Опубликовано в

Так советует делать официальная документация:

/**
 * Preprocess function for breadcrumb.html.twig.
 */
function THEMENAME_preprocess_breadcrumb(&$variables) {
  if ($variables['breadcrumb']) {
    $request = \Drupal::request();
    $route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
    $page_title = \Drupal::service('title_resolver')->getTitle($request, $route);
    $variables['breadcrumb'][] = ['text' => $page_title];
    $variables['#cache']['contexts'][] = 'url';
  }
}

DrupalПолучить текущий заголовок страницы

Опубликовано в
$request = \Drupal::request();
$route_match = \Drupal::routeMatch();
$page_title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());

Встречается ещё такой вариант:

$request = \Drupal::request();
$route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT);
$page_title = \Drupal::service('title_resolver')->getTitle($request, $route);

DrupalРендеринг дерева в Twig шаблоне с помощью макроса

Опубликовано в

Есть twig шаблон, который принимает на вход переменную tree в формате:

$tree = [
  0 => [
    'data' => 'Item 1',
    'childrens' => [
      0 => ['data' => 'Item 1.1'],
      1 => ['data' => 'Item 1.2'],
    ],
  ],
  1 => ['data' => 'Item 2'],
  2 => [...]
];

Нужно вывести эту переменную в виде дерева состоящего из вложенных списков ul/li.

DrupalНовая критическая уязвимость в Drupal 6, 7, 8 — SA-CORE-2018-004

Опубликовано в

Сегодня, как и было обещано, вышли свежие версии Drupal 6, 7 и 8 с закрытой критической уязвимостью SA-CORE-2018-004. Уязвимость позволяет выполнять произвольный код на атакуемой системе. Рекомендуется как можно скорее обновить друпал до версий 6.44, 7.59 или 8.5.3 соответственно.