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

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) {
  $steps_info = array(
    1 => 'Step 1',
    2 => 'Step 2',
    3 => 'Finish step',
  );
 
  if (!isset($form_state['step'])) {
    $form_state['step'] = 1;
    $form_state['steps_values'] = array();
  }
  $step = $form_state['step'];
  $values = &$form_state['values'];
 
  drupal_set_title($steps_info[$step]);
 
  // Step 1
  if ($step == 1) {
    $form['firstname'] = array(
      '#type' => 'textfield',
      '#title' => 'First name',

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

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

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

Способ добавить в 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

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

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

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

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

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

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

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

Модуль 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Универсальная очередь для выполнения произвольных функций

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

Часто хочется выполнить отложенно какие-то функции, без описания очереди в 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'])) {

DrupalBad Practices

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

Список худших практик в друпале, в противовес к Best Practices:

  1. Игнорирование coding standards. Самая распространённая ошибка как новичков, так и бывалых. Стандарты кодирования - первое что должен выучить друпал разработчик.

  2. Транслит в машинных именах. Когда разработчик называет что-то в духе novosti, field_razdel, razmeri, где-то умирает котик.