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

DrupalОднократное выполнение ajax запроса

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

Часто возникает необходимость, чтобы ajax ссылка с классом use-ajax выполнила запрос ровно один раз, после чего прекратила реакцию на клики (например это ссылка загрузки контента в таб). Реализовать задуманное можно с помощью небольшого костыля подменяющего Drupal.Ajax.prototype.eventResponse:

(function ($, Drupal) {
  /**
   * Override AJAX eventResponse function.
   */
  var originalAjaxEventResponse = Drupal.Ajax.prototype.eventResponse;
  Drupal.Ajax.prototype.eventResponse = function (element, event) {
    var $element = $(element);

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

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

Пример добавления для форматтера text_default функционала обрезки текста:

modulename.module

/**
 * Implements hook_field_formatter_third_party_settings_form().
 */
function modulename_field_formatter_third_party_settings_form(FormatterInterface $plugin, FieldDefinitionInterface $field_definition, $view_mode, array $form, FormStateInterface $form_state) {
  $element = [];
 
  if ($plugin->getPluginId() == 'text_default') {
    $element['max_length'] = [
      '#type' => 'number',
      '#title' => t('Max length'),

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

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

Если роут свой, то просто добавляем для него опцию _admin_route: TRUE:

modulename.routing.yml

modulename.example_route:
  ...
  options:
    _admin_route: TRUE

Если роут объявлен в другом модуле, то альтерим его в EventSubscriber-е:

src/EventSubscriber/ModulenameRouteSubscriber.php

<?php
 
namespace Drupal\modulename\EventSubscriber;
 
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
 
class ModulenameRouteSubscriber extends RouteSubscriberBase {

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 FAQ

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

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

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