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

DrupalКэш-контекст по хэшу значения куки

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

В восьмёрке есть кэш-контекст cookies, который возвращает значение куки. Значение возвращается без какой-либо обработки, что временами нежелательно, так как кука может быть оооочень длинной (например, как у меня - пользовательские фильтры вьюхи и настройки сортировки). Выход — создать новый кэш-контекст, который вместо raw значения куки будет возвращать его хэш:

// src/Cache/CookiesHashCacheContext.php
 
namespace Drupal\modulename\Cache;
 
use Drupal\Core\Cache\Context\CookiesCacheContext;
 
class CookiesHashCacheContext extends CookiesCacheContext {
 
  /**

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

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

12 лет, как в друпал не могут добавить возможность указывать атрибуты для элементов <option> в select-ах. Делаем сами:

1. Копируем core/modules/system/templates/select.html.twig в папку своей темы.

2. Изменяем строчку

<option value="{{ option.value }}"{{ option.selected ? ' selected="selected"' }}>{{ option.label }}</option>

на

 

DrupalВыносим определение поддержки javascript в head

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

Для пользователей с включённым javascript друпал добавляет тегу <html> класс js, что позволяет писать более "доступные" стили. Например если на форме включена автоотправка, то можно не просто скрыть кнопку сабмита для всех, а скрыть только для пользователей с js:

.js .example-form .form-submit {
  display: none;
}

Проблема только в одном — скрипт, добавляющий класс js подключается в подвале и поэтому пока страница загружается пользователь будет видеть кнопку, потому что соответствующего класса у <html> ещё нет.

DrupalПоказать форму входа при попытке анонимного пользователя поставить флаг

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

Плагин для модуля Flag, который при попытке анонимного пользователя поставить флаг покажет в диалоге форму входа.

// src/Plugin/ActionLink/AjaxLinkWithAuth.php
 
/**
 * @ActionLinkType(
 *   id = "ajax_link_with_auth",
 *   label = @Translation("AJAX link with authentication"),
 *   description = "An AJAX JavaScript request will be made without reloading the page."
 * )
 */
class AjaxLinkWithAuth extends AJAXactionLink {
 
  /**
   * {@inheritDoc}
   */
  public function getAsFlagLink(FlagInterface $flag, EntityInterface $entity) {

DrupalСоздать свою ajax команду (8)

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

Пример создания ajax команды для вывода сообщений в консоль браузера.

// src/Ajax/ConsoleLogCommand.php
 
namespace Drupal\modulename\Ajax;
 
use Drupal\Core\Ajax\CommandInterface;
 
class ConsoleLogCommand implements CommandInterface {
 
  protected $message;
 
  /**
   * Command constructor.
   */
  public function __construct($message) {
    $this->message = $message;
  }
 
  /**
   * {@inheritDoc}
   */
  public function render() {
    return [
      'command' => 'consoleLog',
      'message' => $this->message,
    ];
  }
 
}

 

DrupalСоздать свой ajax индикатор прогресса

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

Пример создания индикатора прогресса с именем toggleClass, который добавляет/удаляет класс у элемента:

(function ($, Drupal) {
 
  /**
   * Create custom progress type "toggleClass".
   * @see Drupal.Ajax.prototype.beforeSend()
   */
  Drupal.Ajax.prototype.setProgressIndicatorToggleclass = function () {
    var $progressTarget = this.progress.target ? $(this.progress.target) : $(this.element);
    var progressClass = this.progress.class ? this.progress.class : 'ajax-progress-animation';
 
    // Add class
    $progressTarget.addClass(progressClass);

DrupalОтправить уведомление о новом заказе в Commerce 2

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

Во втором комерце практически все хуки заменили на события, поэтому теперь вместо реализации hook_commerce_checkout_complete() надо подписываться на событие commerce_order.place.post_transition:

// src/EventSubscriber/ModulenameEventSubscriber.php
 
namespace Drupal\modulename\EventSubscriber;
 
use Drupal\commerce_order\Entity\OrderInterface;
use Drupal\state_machine\Event\WorkflowTransitionEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
class ModulenameEventSubscriber implements EventSubscriberInterface {
 
  /**

DrupalФункции для работы с адресами в twig

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

Функция file_url($uri)

Возвращает относительный адрес к файлу по его uri. Умеет работать с путями без схемы.

{{ file_url('public://images/example.jpg') }} -> /sites/default/files/images/example.jpg
{{ file_url('/images/example.jpg') }} -> /images/example.jpg
{{ file_url('images/example.jpg') }} -> /images/example.jpg

Функция path($name, $parameters, $options)

DrupalДобавить в основные настройки сайта свою опцию

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

Пример добавления в основные настройки сайта поля для ввода телефона:

1. Альтерим форму system_site_information_settings:

// MODULENAME.module
 
/**
 * Implements hook_form_FORM_ID_alter(): system_site_information_settings.
 */
function MODULENAME_form_system_site_information_settings_alter(array &$form, FormStateInterface $form_state) {
  $form['site_information']['site_phone'] = [

DrupalКак сделать чтобы все письма отправлялись в html формате (8)

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

1. Скачиваем модуль Swift Mailercomposer require drupal/swiftmailer

2. Включаем — vendor/bin/drush en swiftmailer

3. На странице admin/config/swiftmailer/messages выбираем формат сообщений HTML и убираем галочку с опции Respect provided e-mail format: