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

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

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

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

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

Пример программного добавления в корзину товара 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() добавляем свой таск, копируем файл настроек (при необходимости), изменяем его, сбрасываем кэш:

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

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

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

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

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

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

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

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

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

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

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

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

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