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

DrupalСделать чтобы форма входа открывалась в диалоге

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

Код добавляет необходимые атрибуты ссылке "Login" в "User account menu", чтобы форма входа открывалась в jQuery UI Dialog.

/**
 * Preprocess function for menu--account.html.twig.
 */
function THEMENAME_preprocess_menu__account(&$vars) {
  if (\Drupal::currentUser()->isAnonymous()) {
    $login_link_url = $vars['items']['user.logout']['url']; /** @var Url $login_link_url */
    $login_link_url->mergeOptions([
      'attributes' => [
        'class' => ['use-ajax'],
        'data-dialog-type' => 'modal',
      ],
    ]);

DrupalСоздание табличной формы с возможностью сортировки

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

Пример формы для сортировки нод по полю field_weight

class ExampleDraggableForm extends FormBase {
 
  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'example_draggable_form';
  }
 
  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['table'] = [
      '#type' => 'table',
      '#header' => ['Title', 'Weight'],
      '#empty' => 'Empty...',
      '#tabledrag' => [[
        'action' => 'order',
        'relationship' => 'sibling',
        'group' => 'node-weight',

DrupalДобавить вкладку/таб/локальную-задачу/local-task для определённого типа материала

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

Пример добавления вкладки для материалов типа page:

src/Controller/ModulenameController.php

class ModulenameController extends ControllerBase {
 
  public function exampleTabContent(NodeInterface $node) {
    return ['#markup' => 'Tab content...'];
  }
 
  public function exampleTabAccess(NodeInterface $node) {
    return AccessResult::allowedIf($node->bundle() === 'page');
  }
 
}

modulename.routing.yml

entity.node.example_tab:
  path: '/node/{node}/example-tab'
  defaults:

DrupalКак создать свой составной элемент формы

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

Пример создания элемента формы fullname с тремя полями - Фамилия, имя, отчество.

src/Element/FullnameElement.php

<?php
 
namespace Drupal\modulename\Element;
 
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\FormElement;
 
/**
 * @FormElement("fullname")
 */
class FullnameElement extends FormElement {
 
  /**
   * {@inheritDoc}
   */
  public function getInfo() {
    $class = get_class($this);
 
    return [
      '#input' => TRUE,
      '#process' => [
        [$class, 'processElement'],
      ],

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 Dev FAQ

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

Все консольные команды рассчитаны на выполнение из корня друпала. Windows пользователям перед выполнением команд в cmd.exe нужно заменить разделитель директорий с / на \, т.е. вместо например 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 $fileInput = $('.file-input-selector', context);
      if ($fileInput.length) {
        Drupal.behaviors.fileAutoUpload.detach($fileInput.parent(), settings, 'unload');
        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, '');