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

DrupalКак из Javascript выполнить ajax запрос с помощью Drupal Ajax API?

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

Пример выполнения ajax запроса на внутренний адрес path/to/controller:

var ajax = new Drupal.Ajax(false, false, {
  url: Drupal.url('path/to/controller')
});
ajax.execute().done(function () {
  alert('Done');
});

Контроллер должен вернуть набор команд ajax-фреймворка.

DrupalДинамический url ajax-ссылок

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

После загрузки страницы для каждой ссылки с классом use-ajax создаётся объект Drupal.Ajax, в котором фиксируется адрес, на который по клику отправится ajax запрос. После создания этого объекта менять href ссылки уже бесполезно, надо вручную лезть в Drupal.ajax.instances и менять options.url у нужного объекта.

Ниже пример того, как можно перед отправкой ajax запроса автоматически менять его адрес на значение атрибута ссылки data-ajax-url:

(function ($, Drupal) {

DrupalDrupal 8 FAQ

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

Обновляемый список простых вопросов и ответов по Drupal 8.

Все консольные команды рассчитаны на выполнение из корня друпала. Windows пользователям перед выполнением команд нужно заменить разделитель директорий с / на \, т.е. вместо vendor/bin/drush писать vendor\bin\drush.

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';
  }
}