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

Подписка на Лента Блог музицирующего веб-девелопера
URL-адрес: http://xandeadx.ru
Обновлено: 1 мин. 53 сек. назад

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

сб, 04/07/2020 - 16:57
Введение

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

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

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

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

пт, 15/05/2020 - 02:19
<?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_REVERSIBLE, * weight = 20, * ) */

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

ср, 22/04/2020 - 04:32

У некоторых почему-то возникают сложности встраивания разметки 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__text" href="{{ item.url }}" itemprop="item"> <span itemprop="name">{{ item.text }}</span> </a>

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

пт, 13/03/2020 - 17:49

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

// 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); } }

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

ср, 11/03/2020 - 16:57

Простой плагин для 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: Оптимизация кэширования больших меню

пн, 09/03/2020 - 01:39

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

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

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

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

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

ср, 04/03/2020 - 23:20

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

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

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

ср, 04/03/2020 - 04:28

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

вс, 01/03/2020 - 18:00

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

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

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

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

сб, 22/02/2020 - 04:38

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

src/Plugin/ActionLink/AjaxOrLoginActionLink.php:

/** * @ActionLinkType( * id = "ajax_login_link", * label = @Translation("AJAX link (for loged users)"), * description = "An AJAX JavaScript request will be made without reloading the page." * ) */ class AjaxOrLoginActionLink extends AJAXactionLink {   /** * {@inheritDoc} */ public function getAsFlagLink(FlagInterface $flag, EntityInterface $entity) {

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

пт, 14/02/2020 - 16:42

Пример создания 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 индикатор прогресса

пт, 14/02/2020 - 15:44

Пример создания индикатора прогресса с именем 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

пт, 24/01/2020 - 00:17

Во втором комерце практически все хуки заменили на события, поэтому теперь вместо реализации 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

чт, 23/01/2020 - 21:59

Функция 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)

Возвращает относительный адрес по роуту.

{{ path('entity.node.canonical', {'node':123}) }} {# /node/123 #}

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

чт, 23/01/2020 - 02:42

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

1. 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'] = [ '#type' => 'textfield', '#title' => t('Phone'),

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

пн, 13/01/2020 - 00:37

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

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

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

Читать дальше →

Похожие записи:

Категории: Друпалургия

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

вс, 12/01/2020 - 17:52

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

src/Plugin/Derivative/TermLinks.php:

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

Читать дальше →

Похожие записи:

Категории: Друпалургия

Drupal: Добавить в меню динамическую ссылку

вс, 12/01/2020 - 02:03

Пример добавления в меню 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: Программная реализация ЧПУ

пт, 10/01/2020 - 07:00

Задача — из адреса в формате /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 — хранение большого числа характеристик сущности в одном поле

пт, 03/01/2020 - 22:03

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

Читать дальше →

Похожие записи:

Категории: Друпалургия

Страницы