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

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_match = \Drupal::routeMatch();
    $page_title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());
 
    if ($page_title) {
      $variables['breadcrumb'][] = [
        'text' => $page_title
      ];
    }
  }
}

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(\Symfony\Cmf\Component\Routing\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 соответственно.

DrupalПрограммно получить подпункты определённого пункта меню

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

Пример получения подпунктов пункта меню с uuid cc9519f7-66d5-4031-acd9-c6a4a0b00a39:

$menu_tree_builder = \Drupal::menuTree();
$menu_tree_parameters = (new MenuTreeParameters())
  ->setRoot('menu_link_content:cc9519f7-66d5-4031-acd9-c6a4a0b00a39')
  ->excludeRoot()
  ->setMaxDepth(1);
$menu_tree_elements = $menu_tree_builder->load('main', $menu_tree_parameters);

Будет работать как с пользовательскими пунктами меню, так и добавленными через yml файлы.

DrupalИзменить тип всех кнопок с <input type="submit"> на <button type="submit">

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

Часто по дизайну или функционалу вместо кнопок типа <input type="submit" value="Submit" /> нужны кнопки типа <button type="submit">Submit</button>. Сменить тип достаточно просто:

В папке темы создаём файл input--submit.html.twig:

<button{{ attributes }}>{{ attributes.value }}</button>
{{ children }}

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

DrupalПолучить экземпляр класса BlockContent по машинному имени его инстанса

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

Дано — машинное имя инстанса контентного блока, добавленного на странице admin/structure/block.

Задача — получить id контентного блока и его экземпляр класса BlockContent.

Решение на примере инстанса блока с именем page_header:

/** @var BlockInterface $block */
$block = Block::load('page_header');
/** @var BlockPluginInterface $block_plugin */
$block_plugin = $block->getPlugin();
$block_content_uuid = $block_plugin->getDerivativeId();
$block_content_id = \Drupal::service('block_content.uuid_lookup')->get($block_content_uuid);

DrupalОтправить контактную форму с помощью AJAX

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

AJAXификация всех контактных форм с поддержкой валидации:

/**
 * Implements hook_form_BASE_FORM_ID_alter(): contact_message_form.
 */
function modulename_form_contact_message_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form_ajax_wrapper_id = Html::getId($form['#form_id']) . '-ajax-wrapper';
  $form['#prefix'] = '<div id="' . $form_ajax_wrapper_id . '">';
  $form['#suffix'] = '</div>';
 
  $form['actions']['submit']['#ajax'] = [
    'wrapper' => $form_ajax_wrapper_id,
    'callback' => 'modulename_form_contact_message_form_ajax',