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

DrupalПлагин блока, генерящий динамический контент с помощью #lazy_builder

Пример плагина блока, выводящий текущее время. Блок будет закэширован один раз, но контент при этом будет всегда актуальный (за исключением случая, когда включён модуль Internal Page Cache и страницу открыл аноним без сессии).

// src/Plugin/Block/CurrentDateBlock.php
 
namespace Drupal\mymodule\Plugin\Block;
 
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Security\TrustedCallbackInterface;
 
/**
 * @Block(
 *   id = "current_date",
 *   admin_label = @Translation("Current date"),
 *   category = @Translation("Custom"),
 * )
 */

DrupalAJAX команда для сброса значений полей формы

Опубликовано
// src/Ajax/FormResetCommand.php
 
namespace Drupal\modulename\Ajax;
 
use Drupal\Core\Ajax\CommandInterface;
 
class FormResetCommand implements CommandInterface {
 
  protected string $form_selector;
 
  public function __construct(string $form_selector) {
    $this->form_selector = $form_selector;
  }
 
  public function render(): array {
    return [
      'command' => 'invoke',
      'selector' => $this->form_selector,
      'method' => 'trigger',
      'args' => ['reset'],
    ];
  }
 
}

Использование:

$response = new AjaxResponse();

DrupalДобавляем возможность использовать токены в адресе получателя контактной формы

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

Скоро будет 12 лет, как на drupal.org весит незакрытое ишью с просьбой добавить возможность использовать токены в контактных формах, но воз и ныне там. По традиции фиксим самостоятельно:

// MODULENAME.module
 
/**
 * Implements hook_form_BASE_FORM_ID_alter(): contact_form_form.
 */
function MODULENAME_form_contact_form_form_alter(array &$form, FormStateInterface $form_state) {
  $form['recipients_new'] = [
    '#type' => 'textfield',
    '#title' => $form['recipients']['#title'],

DrupalПрограммное добавление сущностей

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

Контент-сущности

Узнать список доступных полей у конкретной контент-сущности можно заглянув в её метод baseFieldDefinitions().

Нода:

$node = \Drupal\node\Entity\Node::create([
  // Required fields
  'type' => 'page', // Node type id
  'title' => 'Example node',
  // Optional fields
  'status' => \Drupal\node\NodeInterface::PUBLISHED,
  'uid' => 0, // User id. 0 - is anonymouse
  'created' => time(),
  'changed' => time(),
  'promote' => \Drupal\node\NodeInterface::NOT_PROMOTED,

DrupalДобавляем возможность указывать тип прогрессбара для ajax ссылок

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

Небольшой костыль, который позволит указывать тип прогрессбара ajax-ссылки в атрибуте data-progress-type.

// ajax-progress-type.js
 
(function ($, Drupal) {
 
  /**
   * Override AJAX "beforeSend" callback.
   */
  var originalAjaxBeforeSend = Drupal.Ajax.prototype.beforeSend;
  Drupal.Ajax.prototype.beforeSend = function (xmlhttprequest, options) {
    var $element = $(this.element);
 
    // Set progress type from "data-progress-type" attribute
    // @TODO Remove after close issue https://www.drupal.org/project/drupal/issues/2818463

DrupalТюнинг кэширования блоков с формой

По умолчанию блоки с формами кэшируются только для анонимных пользователей. Для залогинённых же друпал добавляет во все формы элемент form_token со свойством '#cache' => ['max-age' => 0] (тырк), который запрещает кэшировать все вышестоящие элементы (блок, страница и т.д.). Чтобы этого избежать и включить кэширование блока для всех, нужно отключить генерацию form_token:

 

DrupalКак добавить настройки к блоку, созданному в стороннем модуле (8)

Пример добавления чекбокса в форму настройки всех блоков меню:

// MODULENAME.module
 
/**
 * Implements hook_form_FORM_ID_alter(): block_form.
 */
function MODULENAME_form_block_form_alter(array &$form, FormStateInterface $form_state): void {
  $block_config = $form_state->getFormObject()->getEntity(); /** @var BlockInterface $block_config */
  $block_plugin = $block_config->getPlugin(); /** @var BlockPluginInterface $block_plugin */
 
  if ($block_plugin instanceof SystemMenuBlock) {
    $form['third_party_settings']['MODULENAME']['nofollow'] = [

DrupalАвтоматизированное тестирование готового сайта с помощью Codeception

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

Введение

Codeception — это популярный фреймворк для тестирования веб-приложений. Он написан поверх PHPUnit и позволяет более элегантно писать тесты используя методологию BDD.

Поддерживает три вида тестирования:

Unit tests (модульные тесты) — тестирование отдельных php-классов.

DrupalТекстовый фильтр добавляющий внешним ссылкам атрибут rel=nofollow

Опубликовано
<?php
// src/Plugin/Filter/NofollowExternalLinksFilter.php
 
namespace Drupal\modulename\Plugin\Filter;
 
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\UrlHelper;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
 
/**
 * @Filter(
 *   id = "nofollow_external_links_filter",
 *   title = @Translation("Nofollow external links"),
 *   description = @Translation("Add attribute rel=nofollow to external links."),
 *   type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
 *   weight = 20,
 * )
 */