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

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

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

Плагин для модуля 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)

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

Пример создания 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. 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)

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

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() — изменяет исходящие адреса в новый формат