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

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

Drupal: Изменение свойств базовых полей

вс, 01/04/2018 - 01:05

В Drupal 8 поля сущности делятся на два типа — базовые (base fields) и настраиваемые (configurable или bundle fields). Базовые поля раньше назывались свойствами (properties), они не имеют ui, прописываются в коде и изменяются тоже с помощью кода. Настраиваемые поля напротив, создаются и изменяются из админки.

Чтобы изменить базовое поле, нужно создать сущность типа BaseFieldOverride и подменить ею соответствующий инстанс поля (field definition).

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

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

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

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

сб, 31/03/2018 - 03:43

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

Реализация состоит из двух частей:

1. Добавление опции в настройки виджета с помощью hook_field_widget_third_party_settings_form
2. Альтер формы виджета с помощью hook_field_widget_settings_summary_alter

/** * Implements hook_field_widget_third_party_settings_form(). */

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

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

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

Drupal: Drupalgeddon 2018

чт, 29/03/2018 - 03:22

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

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

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

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

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

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

пн, 05/02/2018 - 00:54

Пример добавления контекстных ссылок в произвольный 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)

вт, 30/01/2018 - 03:44

Пример отключения библиотеки 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

пн, 29/01/2018 - 14:52

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

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

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

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

Drupal: Удалить реализацию определённого хука

пт, 05/01/2018 - 04:00

Пример удаления функции user_node_load():

/** * Implements hook_module_implements_alter(). */ function hook_module_implements_alter(&$implementations, $hook) { if ($hook == 'node_load' && isset($implementations['user'])) { unset($implementations['user']); } }

Комментарии

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

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

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

ср, 03/01/2018 - 15:40

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

modulename.install:

/** * Implements hook_schema_alter(). */ function modulename_schema_alter(&$schema) { $entity_info = entity_get_info('taxonomy_term'); $entity_table = $entity_info['base table']; $property_name = 'myproperty';   if (!isset($schema[$entity_table]['fields'][$property_name])) { $schema[$entity_table]['fields'][$property_name] = array( 'type' => 'varchar', 'length' => 255,

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

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

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

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

сб, 16/12/2017 - 19:35

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

$product_id = 123; $quantity = 1; $combine = TRUE;   $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

сб, 02/12/2017 - 19:44

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

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

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

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

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

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

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

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

вс, 05/11/2017 - 18:10

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

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

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

// profilename.install   use Drupal\Component\Utility\OpCodeCache; use Drupal\Core\Site\Settings;   /** * Implements hook_install_tasks_alter(). */

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

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

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

Drupal: Установка Drupal 8 с помощью Composer и бубна

пн, 30/10/2017 - 02:53

Всё чаще стали предлагать работу на Drupal 8, а я ещё толком за него и не брался. Дай думаю для начала создам свой профиль и переведу блог на восьмёрку, благо совсем недавно вышла версия 8.4.

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

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

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

Drupal: Установить дефолтное число значений для unlimited поля

пт, 29/09/2017 - 00:11

Код позволяет в настройках поля выбрать первоначальное число значений для unlimited поля:

/** * Implements hook_form_FORM_ID_alter(): field_ui_field_edit_form. */ function hook_form_field_ui_field_edit_form_alter(&$form, $form_state) { $field_instance = $form['#instance'];   $form['instance']['settings']['default_cardinality'] = array( '#type' => 'textfield', '#title' => t('Default cardinality'), '#default_value' => isset($field_instance['settings']['default_cardinality']) ? $field_instance['settings']['default_cardinality'] : 1, '#weight' => 10,

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

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

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

Drupal: Фиксим вывод reCaptcha на AJAX формах

вт, 29/08/2017 - 00:55

Разработчики модуля reCAPTCHA третий год не могут заставить работать капчу на ajax формах. Проблема в следующем — при перезагрузке формы с помощью AJAX капча пропадает, поскольку модуль никак не реагирует на подгрузку динамического контента. Фиксим самостоятельно:

(function ($) { Drupal.behaviors.mymodule = { attach: function (context, settings) { if ('grecaptcha' in window && context !== document) {

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

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

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

Drupal: Последовательно запустить два Batch-а

вт, 27/06/2017 - 21:05

Если нужно выполнить последовательно два Batch-а и второй Batch никак не зависит от данных первого, то достаточно подряд вызвать batch_set(). Если же второму Batch-у нужны данные от работы первого, то:

/** * Form submit callback. */ function mymodule_myform_submit($form, &$form_state) { // Создаём операции для первого batch-а $operations = array(); for ($i = 0; $i < 100; $i++) { $operations[] = array('mymodule_first_batch_operation', array()); }   // В конец добавляем операцию для запуска второго batch-а

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

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

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

Drupal: Как передать переменную из конструктора Batch в его finished callback

вт, 27/06/2017 - 03:45

Пример передачи значения переменной foo в myform_batch_finished():

/** * Form submit. */ function myform_submit($form, &$form_state) { ... $batch = array( 'operations' => $operations, 'finished' => 'myform_batch_finished', 'foo' => 'bar', );   batch_set($batch); }   /** * Batch finished callback. */ function myform_batch_finished($success, $results, $operations) { $batch_set = _batch_current_set(); debug($batch_set['foo']); }

Комментарии

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

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

Drupal: Автоматическое удаление устаревших анонимных заказов в статусе "корзина"

чт, 18/05/2017 - 17:43

Drupal Commerce самостоятельно не удаляет устаревшие анонимные заказы в статусе "корзина", что приводит к бессмысленному распуханию таблицы commerce_order.

"Устаревшими" я считаю заказы анонимных пользователя, чьи сессии удалены сборщиком мусора (по умолчанию это сессии старше 3 дней).

Решаем проблему:

/** * Implements hook_cron(). */ function hook_cron() { if (module_exists('commerce_order')) { $order_ids = db_select('commerce_order', 'o') ->fields('o', array('order_id')) ->condition('o.uid', 0)

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

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

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

Drupal: О работе пользовательских сессий

вт, 09/05/2017 - 19:47

Друпал не использует нативный механизм сессий PHP, основанный на файлах sess_*. Вместо этого он использует свой, с хранением сессий в базе данных (таблица sessions). Клац.

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

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

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

Страницы