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

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

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.

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

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

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

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

пт, 27/12/2019 - 02:27

Пример добавления возможности фильтровать числовые поля по нескольким значениями (добавления оператора "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'),

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

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

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

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

пн, 23/12/2019 - 01:00
/** * Implements hook_form_BASE_FORM_ID_alter(): commerce_order_item_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', 'selector' => ':input[data-drupal-selector="add-to-cart-button-' . $product->id() . '"]',

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

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

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

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

пн, 16/12/2019 - 23:03

Пример выполнения очереди 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: Добавить сторонней сущности своё базовое поле

сб, 23/11/2019 - 04:57

Пример добавления терминам базового поля 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; } }

modulename.install

/**

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

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

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

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

вт, 19/11/2019 - 01:12

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

2. Пишем код:

/** * Implements hook_ENTITY_TYPE_presave(): flagging. */ function modulename_flagging_presave(FlaggingInterface $flagging) { if ($flagging->hasField('field_ip')) { $flagging->set('field_ip', \Drupal::request()->getClientIp()); }   if ($flagging->getFlagId() == 'my_flag' && \Drupal::currentUser()->isAnonymous()) { $flagging_count = \Drupal::entityQuery('flagging') ->condition('flag_id', $flagging->getFlagId())

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

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

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

Drupal: Создание своего текстового фильтра

чт, 27/06/2019 - 07:14

Пример фильтра для оборачивания таблиц в div:

src/Plugin/Filter/TableWrapperFilter.php

/** * @Filter( * id = "table_wrapper_filter", * title = @Translation("Table wrapper"), * description = @Translation("Wrap tables to div."), * type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_REVERSIBLE, * weight = 20 * ) */ class TableWrapperFilter extends FilterBase {   /** * {@inheritdoc} */ public function process($text, $langcode) { $result = new FilterProcessResult($text);

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

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

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

Javascript: Отличие Debounce от Throttling

ср, 26/06/2019 - 23:02

Debounce — функция будет выполнена только тогда, когда после последней попытки вызова прошло определённое время. Задержка начинает заново отсчитываться с каждой новой попыткой вызова. Например если повесить debounce на onscroll с временем 100ms, то функция выполнится через 100ms после прекращения скрола.

Схематично:

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

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

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

Drupal: Однократное выполнение ajax запроса

пт, 24/05/2019 - 19:50

Часто возникает необходимость, чтобы ajax ссылка с классом use-ajax выполнила запрос ровно один раз, после чего прекратила реакцию на клики (например это ссылка загрузки контента в таб). Реализовать задуманное можно подменой функции Drupal.Ajax.prototype.eventResponse:

(function ($, Drupal) { /** * Override AJAX eventResponse function. */ var originalAjaxEventResponse = Drupal.Ajax.prototype.eventResponse; Drupal.Ajax.prototype.eventResponse = function (element, event) { var $element = $(element);

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

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

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

Drupal: Расширить сторонний форматтер своим функционалом

сб, 11/05/2019 - 19:37

Пример добавления для форматтера text_default функционала обрезки текста:

modulename.module

/** * Implements hook_field_formatter_third_party_settings_form(). */ function modulename_field_formatter_third_party_settings_form(FormatterInterface $plugin, FieldDefinitionInterface $field_definition, $view_mode, array $form, FormStateInterface $form_state) { $element = [];   if ($plugin->getPluginId() == 'text_default') { $element['max_length'] = [ '#type' => 'number', '#title' => t('Max length'),

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

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

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

Страницы