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

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

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). Клац.

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

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

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

Drupal: Добавить класс определённому элементу перед выполнением ajax запроса

ср, 03/05/2017 - 22:48

Очень часто перед выполнением ajax запроса нужно добавить какому-то элементу определённый класс, а после получения ответа убрать его, чтобы например показывать какую-нибудь анимашу, мол keep calm и всё такое.

Реализовать можно с помощью создания собственного типа ajax-прогресса:

(function ($) { if (Drupal.ajax) { var ajaxBeforeSend = Drupal.ajax.prototype.beforeSend; var ajaxSuccess = Drupal.ajax.prototype.success; var ajaxError = Drupal.ajax.prototype.error;   Drupal.ajax.prototype.beforeSend = function(xmlhttprequest, options) {

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

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

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

Drupal: Высылать письмо при входе администратора с нового браузера

пн, 03/04/2017 - 03:00

Небольшой код, который уведомляет о входе администратора с нового браузера:

/** * Implements hook_user_login(). */ function modulename_user_login(&$edit, $account) { if ( $account->uid == 1 && (empty($account->data['useragent']) || $account->data['useragent'] != md5($_SERVER['HTTP_USER_AGENT'])) ) { $message = 'Дата: ' . date('r') . "\n"; $message .= 'IP: ' . ip_address() . "\n"; $message .= 'Host: ' . @gethostbyaddr(ip_address()) . "\n"; $message .= 'User Agent: ' . $_SERVER['HTTP_USER_AGENT'] . "\n";

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

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

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

Drupal: Ежедневно присылать на почту список PHP ошибок

пн, 16/01/2017 - 00:55

Код раз в день высылает на основную почту список PHP ошибок из watchdog:

/** * Implements hook_cron(). */ function modulename_cron() { if (module_exists('dblog') && date('d') != date('d', variable_get('cron_last'))) { $events = db_query(" SELECT wid, type, message, variables, timestamp FROM {watchdog} WHERE type = 'php' AND timestamp > :last_run ORDER BY wid LIMIT 100 ", array(':last_run' => variable_get('cron_last')));   if ($events->rowCount()) { $items = array(); foreach ($events as $event) {

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

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

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

Drupal: Чиним onclick на ajax кнопках

вт, 10/01/2017 - 17:38

В седьмом друпале есть фантомный баг с ajax кнопками — если попытаться навесить на такую кнопку onclick, то он не сработает, так как после события mousedown кнопка дизаблится и последующие события не вызываются. Фантомный он потому, что если ответ от сервера придёт очень быстро (например на локальном компьютере где пинги нулевые), то onclick таки выполнится.

Пример проблемного кода:

$form['submit'] = array( '#type' => 'submit', '#value' => 'Submit', '#ajax' => array( 'wrapper' => '...', 'callback' => '...', ),

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

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

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

Drupal: Добавить на страницу данные о товаре в формате JSON-LD

вт, 06/12/2016 - 01:58

Пример добавления данных о товаре в формате JSON-LD:

/** * Implements hook_node_view(). */ function hook_node_view($node, $view_mode, $langcode) { if ($node->type == 'product_display' && $view_mode == 'full') { $product_wrap = entity_metadata_wrapper('node', $node)->field_product; $product_price = $product_wrap->commerce_price->value();   $jsonld = array( '@context' => 'http://schema.org/', '@type' => 'Product', 'name' => $product_wrap->title->value(), 'sku' => $product_wrap->sku->value(),

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

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

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

Drupal: Простая вставка в текст динамического контента (без использования PHP filter)

вс, 09/10/2016 - 01:41

Часто нужно вставить в середину ноды или блока какой-нибудь контент, сгенерированный с помощью php, например вьюху или переменную. Для решения задачи можно либо вывести контент с помощь php фильтра, либо сделать str_replace() в preprocess функции, либо накидать простой текстовый фильтр, заменяющий токены [function:function_name] на результат выполнения функции:

/** * Implements hook_filter_info(). */ function modulename_filter_info() { $filters['token_function'] = array( 'title' => t('Replace [function:*] to function result'),

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

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

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

Drupal: Запретить установку ajax-кнопке атрибута disabled при клике

пт, 09/09/2016 - 21:48

Друпал при клике на ajax кнопку устанавливает ей атрибут disabled для запрета повторной отправки формы до того, как придёт ответ. Чтобы отключить такое поведение и разрешить многократное нажатие ajax-кнопки, нужно во-первых, подключить js файл со следующим кодом:

(function ($) { var originalBeforeSendCallback = Drupal.ajax.prototype.beforeSend; Drupal.ajax.prototype.beforeSend = function(xmlhttprequest, options) { originalBeforeSendCallback.apply(this, arguments);   if ('disabled' in this && !this.disabled) { this.ajaxing = false;

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

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

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

Drupal: Многошаговая форма на AJAX

чт, 28/07/2016 - 17:51

Чтобы сделать навигацию по многошаговой форме на AJAX нужно:

1. Добавить форме div враппер с уникальным id:

$form['#prefix'] = '<div id="multistep-ajax-form-wrapper">'; $form['#suffix'] = '</div>';

2. Кнопкам Prev и Next добавить опцию #ajax:

'#ajax' => array( 'callback' => 'modulename_test_form_ajax_nav', 'wrapper' => 'multistep-ajax-form-wrapper', ),

3. Написать ajax callback, который будет просто обновлять форму:

/** * Ajax nav callback. */

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

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

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

Drupal: Создание многошаговых форм (multistep form)

чт, 28/07/2016 - 02:32

Пример создания формы из трёх шагов:

/** * Form builder. */ function modulename_test_form($form, &$form_state) { if (!isset($form_state['step'])) { $form_state['step'] = 1; $form_state['steps_values'] = array(); } $step = $form_state['step']; $max_step = 3; $values = &$form_state['values'];   // Step 1 if ($step == 1) { $form['firstname'] = array( '#type' => 'textfield', '#title' => 'First name', '#default_value' => isset($values['firstname']) ? $values['firstname'] : '', ); } // Step 2

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

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

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

Drupal: Несколько одинаковых форм на одной странице

ср, 27/07/2016 - 01:36

Пример вывода нескольких одинаковых форм на одной странице:

/** * Implements hook_menu(). */ function modulename_menu() { $items = array();   $items['forms'] = array( 'title' => 'Forms', 'page callback' => 'modulename_multiple_forms', 'access callback' => TRUE, );   return $items; }   /** * Page callback. */ function modulename_multiple_forms() { $build = array();   for ($i = 0; $i < 3; $i++) { $build[] = drupal_get_form('modulename_test_form_' . $i, $i); }   return $build; }   /** * Implements hook_forms(). */

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

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

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

Drupal: Добавить в Commerce валюту BYN

пт, 15/07/2016 - 20:20

Способ добавить в Drupal Commerce новую белорусскую валюту BYN:

/** * Implements hook_commerce_currency_info(). */ function MODULENAME_commerce_currency_info() { return array ( 'BYN' => array( 'code' => 'BYN', 'numeric_code' => '933', 'symbol' => 'руб.', 'name' => t('Belarusian ruble'), 'symbol_placement' => 'after', 'code_placement' => 'hidden', 'minor_unit' => t('Kopek'), 'major_unit' => t('Ruble'), 'rounding_step' => '0', 'thousands_separator' => ' ', 'decimal_separator' => ',', ),

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

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

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

Javascript: Вывести карту из конструктора Яндекс.Карт в jQuery UI Dialog

пт, 08/07/2016 - 23:29

Пример вывода карты, созданной в конструкторе Яндекс.Карт в jQuery UI Dialog:

$('<div id="map"></div>').dialog({ open: function() { var mapScript = document.createElement('script'); mapScript.src = 'https://api-maps.yandex.ru/services/constructor/1.0/js/?sid=...&lang=ru_RU&sourceType=constructor&scroll=true'; this.appendChild(mapScript); }, close: function() { $(this).remove(); }, title: 'Карта', width: 500, height: 400, modal: true });

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

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

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

Страницы