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

DrupalКэширование блоков с формой

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

 

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

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

/**
 * Implements hook_form_FORM_ID_alter(): block_form.
 */
function MODULENAME_form_block_form_alter(array &$form, FormStateInterface $form_state) {
  $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'] = [
      '#type' => 'checkbox',

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 link"),
 *   description = @Translation("Add attribute rel=nofollow to external links."),
 *   type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
 *   weight = 20,
 * )
 */

DrupalХлебные крошки + schema.org

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

У некоторых почему-то возникают сложности встраивания разметки schema.org в хлебные крошки. Листинг файла breadcrumb.html.twig:

{% if breadcrumb %}
  <ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList">
    {% for index, item in breadcrumb %}
      <li class="breadcrumb__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
        {% if item.url %}
          <a class="breadcrumb__link" href="{{ item.url }}" itemprop="item">
            <span itemprop="name">{{ item.text }}</span>
          </a>

DrupalДобавляем на страницу управления отображением комментария поля "автор" и "дата создания"

Простой способ добавить поля "автор" и "дата создания" на страницу управления отображением комментария:

// MODULENAME.module
 
/**
 * Implements hook_entity_base_field_info_alter().
 */
function MODULENAME_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'comment') {
    /** @see \Drupal\comment\Entity\Comment::baseFieldDefinitions() */
    $fields['uid']->setDisplayConfigurable('view', TRUE);
    $fields['created']->setDisplayConfigurable('view', TRUE);
  }
}

DrupalViews фильтр "товар имеет опубликованную вариацию"

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

Простой плагин для Views, добавляющий фильтр "Товар имеет хоть одну опубликованную вариацию". Полезен когда у товаров может быть несколько вариаций и не хочется мучатся с агрегацией.

// src/Plugin/views/filter/ProductHasPublishedVariationViewsFilter.php
 
/**
 * @ViewsFilter("product_has_published_variation")
 */
class ProductHasPublishedVariationViewsFilter extends FilterPluginBase {
 
  /**
   * {@inheritDoc}
   */
  public function query() {
    $this->ensureMyTable();
    $query = $this->query; /** @var \Drupal\views\Plugin\views\query\Sql $query */

DrupalОптимизация кэширования больших меню

Всем блокам меню друпал добавляет кэш-контекст route.menu_active_trails, который создаёт новый кэш блока в зависимости от активной ссылки (т.е. если меню содержит сто ссылок, то по итогу в cache_render будет 101 вариант этого блока).

Если меню достаточно большое и все пункты в нём раскрыты по умолчанию, то можно безболезненно удалить этот кэш-контекст, позволив держать в кэше только одну версию блока.

Пример для меню main:

/**
 * Implements hook_block_build_BASE_BLOCK_ID_alter(): system_menu_block.
 */

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>

на