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

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

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 });

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

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

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

Drupal: Добавить в токен [term:parents:*] текущий термин

ср, 06/07/2016 - 23:58

Понадобилось в Metatag вывести через запятую иерархию имён термина. Нашёл токен [term:parents:join:, ], но проблема в том, что в него не входит текущий термин. Пришлось реализовать свой токен [term:parents-with-current:*]:

/** * Implements hook_token_info(). */ function MODULENAME_token_info() { $info['tokens']['term']['parents-with-current'] = array( 'name' => t('Parents with current term'), 'description' => t("An array of all the term's parents with current term, starting with the root."), 'type' => 'array', );

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

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

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

Drupal: Добавить в мета-тег canonical номер текущей страницы

чт, 19/05/2016 - 17:36

Модуль Metatag не позволяет с помощью токенов добавить в canonical номер текущей страницы. Создадим собственный токен [current-page:url:with-current-pager]:

/** * Implements hook_token_info(). */ function modulename_token_info() { return array( 'tokens' => array( 'url' => array( 'with-current-pager' => array( 'name' => t('URL with current page number'), 'description' => t('URL with current page number'), ), ), ), ); }   /** * Implements hook_tokens(). */

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

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

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

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

чт, 12/05/2016 - 16:37

Программное удаление всех терминов из словаря с vid=1:

$vocabulary_vid = 1;   $root_terms = taxonomy_get_tree($vocabulary_vid, 0, 1); foreach ($root_terms as $term) { taxonomy_term_delete($term->tid); }

Комментарии

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

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

Drupal: Универсальная очередь для выполнения произвольных функций

чт, 12/05/2016 - 04:07

Часто хочется выполнить отложенно какие-то функции, без описания очереди в hook_cron_queue_info() и реализации worker callback-a. Сделать это можно несколькими строчками кода:

/** * Implements hook_cron_queue_info(). */ function modulename_cron_queue_info() { $queues['universal_queue'] = array( 'worker callback' => 'modulename_universal_queue_callback', ); return $queues; }   /** * Universal queue worker callback. */ function modulename_universal_queue_callback($data) { if (isset($data['file'])) {

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

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

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

Страницы