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

DrupalDrupalgeddon 2018

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

Во всех основных версиях друпала (6, 7, 8) найдена критическая уязвимость, позволяющая удалённо выполнять код любому анонимному пользователю. Дыра находится в компоненте Form API/Render API. По мнению экспертов в течении дня появится эксплоит и автоматизированные средства взлома. Крайне рекомендуется обновить друпал до последней версии.

Поддержка Drupal 6 официально прекращена, но есть свежая версия от комунити - https://github.com/d6lts/drupal/releases/tag/6.42

DrupalДобавить контекстные ссылки своему html элементу

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

Пример добавления контекстных ссылок в произвольный html элемент:

<div class="contextual-links-region">
  <?php
  if ($GLOBALS['user']->uid == 1) {
    $contextual_links = array(
      '#type' => 'contextual_links',
      '#links' => array(
        array(
          'title' => t('Configure'),
          'href' => 'admin/config/system/site-information',
        ),
      ),
      '#pre_render' => array(),
    );
    echo drupal_render($contextual_links);
  }
  ?>
 
  Block content...
</div>

DrupalОтключить в рантайме определённую фронтэнд-библиотеку (library)

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

Пример отключения библиотеки core/drupal.active-link на страницах нод:

modulename.services.yml:

services:
  modulename.subscriber:
    class: Drupal\modulename\EventSubscriber\ModulenameSubscriber
    tags:
      - { name: event_subscriber }

src/EventSubscriber/ModulenameSubscriber.php:

<?php
 
namespace Drupal\modulename\EventSubscriber;
 
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

DrupalПодключение своих js и css файлов в Drupal 8

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

В Drupal 8 немного усложнился процесс подключения своих стилей и скриптов. Теперь все js и css файлы должны быть объединены в так называемые libraries (библиотеки), описаны в файле *.libraries.yml и подключены одним из способов. Начнём по порядку.

DrupalДобавить определённому типу сущности новое свойство

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

Пример добавления терминам таксономии нового текстового свойства myproperty, которое будет хранится в таблице taxonomy_term_data:

modulename.install:

/**
 * Implements hook_schema_alter().
 */
function modulename_schema_alter(&$schema) {
  $entity_table = 'taxonomy_term_data';
  $property_name = 'myproperty';
 
  if (isset($schema[$entity_table]) && !isset($schema[$entity_table]['fields'][$property_name])) {
    $schema[$entity_table]['fields'][$property_name] = array(
      'type' => 'varchar',
      'length' => 255,
      'not null' => TRUE,

DrupalПрограммно добавить товар в корзину

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

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

$product_id = 123;
$quantity = 1;
$combine = TRUE;
 
// Простой вариант
$line_item = commerce_cart_product_add_by_id($product_id, $quantity, $combine, $GLOBALS['user']->uid);
 
// Развёрнутый вариант
$product = commerce_product_load($product_id);
$line_item = commerce_product_line_item_new($product, $quantity);
$line_item = commerce_cart_product_add($GLOBALS['user']->uid, $line_item, $combine);

DrupalДинамическая цена доставки типа Flat Rate

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

Во всех мануалах модуля Commerce Shipping советуют создавать отдельный способ доставки (shipping service) на каждую градацию цены, например:

- доставка для заказов дешевле 5000 р.
- доставка для заказов от 5000 до 10000 р.
- ...

У каждого способа будет своя цена и свои условия в rules компоненте.

Однако можно создать один способ доставки, а цену высчитывать динамически с помощью PHP:

DrupalИзменить расположение public, private и temporary директорий из инсталляционного профиля

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

Задача — изменить расположение public://, private:// и temporary:// директорий при инсталляции друпала с помощью своего профиля.

Сложность — эти директории теперь прописываются только в settings.php и менять их нужно на самой ранней стадии установки друпала.

Решение — в hook_install_tasks_alter() добавляем свой таск, копируем файл настроек (при необходимости), изменяем его, сбрасываем кэш: