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

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

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

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

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

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

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

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

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

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

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

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

Один из способов добавления данных о товаре в формате JSON-LD в head страницы:

/**
 * 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)

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

Часто нужно вставить в середину содержимого ноды или блока какой-нибудь контент, сгенерированный с помощью 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 при клике

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

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

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

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

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

Чтобы сделать навигацию по многошаговой форме на 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)

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

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

/**
 * 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Несколько одинаковых форм на одной странице

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

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

/**
 * 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().
 */