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

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',

DrupalИзменить дефолтные опции jQuery UI Dialog

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

Пример изменения дефолтных опций всех диалогов из своей темы:

THEMENAME.theme:

/**
 * Implements hook_library_info_alter().
 */
function THEMENAME_library_info_alter(&$libraries, $extension) {
  if ($extension == 'core') {
    $js_path = '/' . drupal_get_path('theme', 'THEMENAME') . '/js/jquery.ui.dialog.defaults.js';
    $libraries['jquery.ui.dialog']['js'][$js_path] = [];
  }
}

js/jquery.ui.dialog.defaults.js:

jQuery.extend(jQuery.ui.dialog.prototype.options, {
  'width': 'auto',
  'modal': true,
  'closeText': Drupal.t('Close')
});

DrupalThird Party Settings — интерфейс хранения дополнительных настроек сущностей и плагинов

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

В Drupal 8 появился унифицированный способ хранения дополнительных настроек в чужих config entities и plugins. Способ называется Third Party Settings.

DrupalИзменение свойств базовых полей

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

В Drupal 8 поля сущности делятся на два типа — базовые (base fields) и настраиваемые (configurable или bundle fields). Базовые поля раньше назывались свойствами (properties), они не имеют ui, прописываются в коде и изменяются тоже с помощью кода. Настраиваемые поля напротив, создаются и изменяются из админки.

Чтобы изменить настройки базового поле, нужно создать сущность типа BaseFieldOverride и подменить ею соответствующий инстанс поля (field definition).

DrupalРасширить существующий виджет своим функционалом

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

Пример добавления нового функционала виджету text_textarea, с помощью которого можно будет включать динамическую высоту поля в зависимости от длины текста.

Реализация состоит из двух частей:

1. Добавление опции в настройки виджета с помощью hook_field_widget_third_party_settings_form
2. Альтер формы виджета с помощью hook_field_widget_form_alter или hook_field_widget_WIDGET_TYPE_form_alter

modulename.module

/**
 * Implements hook_field_widget_third_party_settings_form().
 */

DrupalDrupalgeddon 2018

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

Во всех основных версиях друпала (6, 7, 8) найдена критическая уязвимость, позволяющая удалённо выполнять код любому анонимному пользователю. Дыра находится в компоненте Form API/Render API. По мнению экспертов в течении дня появится эксплоит и автоматизированные средства взлома. Крайне рекомендуется обновить друпал до последней версии.

Поддержка Drupal 6 официально прекращена, но есть свежая версия от комунити - https://github.com/d6lts/drupal/releases/tag/6.42