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

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:

DrupalПрограммно наполнить меню ссылками на термины таксономии

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

Пример программного наполнения меню main ссылками на категории из словаря category (повторение функционала модуля Taxonomy Menu).

src/Plugin/Derivative/TermLinksDeriver.php:

class TermLinksDeriver extends DeriverBase {
 
  /**
   * {@inheritDoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition) {
    /** @var TermStorageInterface $term_storage */
    $term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');

DrupalПрограммно добавить в меню динамическую ссылку

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

Пример добавления в меню main ссылки с динамическим заголовком и адресом. В ней для залогинённых пользователей будем выводить имя пользователя с ссылкой на профиль, а для анонимов ссылку на страницу регистрации.

// src/Plugin/Menu/MyDynamicMenuLink.php
 
class MyDynamicMenuLink extends MenuLinkDefault {
 
  /**
   * {@inheritDoc}
   */
  public function getTitle() {
    $current_user = \Drupal::currentUser();
    return $current_user->isAuthenticated() ? $current_user->getAccountName() : t('Registration');
  }
 
  /**
   * {@inheritDoc}
   */

DrupalПрограммная реализация ЧПУ

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

Задача — из адреса в формате /catalog/notebooks?price_from=xxx&price_to=yyy, в котором /catalog/notebooks это синоним термина, а ?price_from=xxx&price_to=yyy динамические параметры, сделать человекопонятный адрес в формате /catalog/notebooks/price-xxx-yyy.

Теория есть у niklan'a, поэтому сразу к коду.

Для решения надо создать сервис с двумя методами:
processOutbound() — изменяет исходящие адреса в новый формат

DrupalМодуль EAV Field — хранение большого числа характеристик сущности в одном поле

Описание

Несколько лет назад я описывал способы реализации каталога с большим количеством атрибутов товара и одним из способов было использование модели EAV, когда все значения атрибутов хранятся в одном составном поле. Есть несколько модулей разной свежести, пытающиеся реализовать это в друпале, но меня ни один не устроил, поэтому родился EAV Field.

DrupalКак расширить функционал фильтр-плагина Views? (добавляем возможность фильтровать числовые поля по нескольким значениям)

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

Пример добавления возможности фильтровать числовые поля по нескольким значениями (оператор "in").

1. В папке своего модуля src/Plugin/views/filter создаём класс и наследуем его от класса, который нужно расширить. В этом классе переопределяем нужные методы и по необходимости добавляем свои. Аннотацию плагина добавлять не нужно.

class ExtendedNumericFilter extends NumericFilter {
 
  /**
   * {@inheritDoc}
   */
  public function operators() {
    $operators = parent::operators();
 
    $operators['in'] = [
      'title' => $this->t('Is one of'),

DrupalAJAX добавление товара в корзину в Commerce 2

Опубликовано
/**
 * Implements hook_form_BASE_FORM_ID_alter(): commerce_order_item_add_to_cart_form.
 * Alter "Add to cart" form.
 */
function MODULENAME_form_commerce_order_item_add_to_cart_form_alter(array &$form, FormStateInterface $form_state) {
  $product = $form_state->get('product'); /** @var ProductInterface $product */
 
  $form['actions']['submit']['#id'] = 'add-to-cart-button-' . $product->id();
  $form['actions']['submit']['#ajax'] = [
    'callback' => 'MODULENAME_add_to_cart_ajax',
    'event' => 'click',

DrupalВыполнить очередь с помощью Batch API

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

Пример выполнения очереди products_import с помощью Batch API:

class ProductsImportForm extends FormBase {
 
  /**
   * {@inheritDoc}
   */
  public function getFormId() {
    return 'products_import_form';
  }
 
  /**
   * {@inheritDoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Start'),
    ];
 
    return $form;
  }
 
  /**
   * {@inheritDoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {

DrupalДобавить сторонней контент сущности своё базовое поле (base field)

Пример добавления терминам базового поля stored_depth:

// MODULENAME.module
 
/**
 * Implements hook_entity_base_field_info().
 */
function MODULENAME_entity_base_field_info(EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'taxonomy_term') {
    $fields = [];
 
    $fields['stored_depth'] = BaseFieldDefinition::create('integer')
      ->setLabel(t('Depth'))
      ->setSetting('unsigned', TRUE)
      ->setDefaultValue(0);
 
    return $fields;
  }
}

DrupalЗапретить анонимам ставить флаг чаще одного раза в день с одного ip

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

В модуле Flag анонимный юзер может бесконечно флагать одну сущность просто удаляю куку с сессией, что неприемлемо например при реализации лайков. Чтобы это запретить нужно:

1. В админке добавить флагу текстовое поле field_ip.

2. Написать код:

/**
 * Implements hook_ENTITY_TYPE_presave(): flagging.
 */
function MODULENAME_flagging_presave(FlaggingInterface $flagging) {
  // Save user ip
  if ($flagging->hasField('field_ip')) {
    $flagging->set('field_ip', \Drupal::request()->getClientIp());