Уроки

УрокЗнакомство с Display Suite

В этой статье я хотел бы рассказать о весьма полезном модуле, недооценить который просто не возможно. Этот модуль экономит кучу времени и сил при создании тем. Главная мощь модуля заключается в том, что он позволяет настраивать раскладку сущностям. Например, если раньше для темизации конкретного типа материала, приходилось в теме делать для этого типа материалов шаблон, то теперь это можно сделать буквально в пару кликов. Но обо всем по порядку.

УрокТонкости программного создания страниц на сайте

В Друпале программно обычные страницы создаются допольно легким способом. И в 6й, и в 7й, и в 8й версии ядра они создаются похожим образом, а именно - имплементированием хука hook_menu() в свой модуль. В этой статье я не буду подробно останавливаться на базовой части - непосредственном добавлении страниц, так как это очень просто и не вызывает затруднений при самостоятельном обучении. Ведь для добавления страницы достаточно написать несколько строк:

function mymodule_menu() {
  $items = array();
  $items['new_page'] = array(
      'page callback' => 'mymodule_page',
    );
  return $items; 
}

Здесь создаётся страница с урлом new_page. При переходе на этот урл будет возвращено значение из функции mymodule_page().

УрокCоздание и обновление записей в базе данных через Drupal API

В большинстве модулей записи в базу данных делаются постоянно - будь то новые записи, или же обновление уже существующих. Друпал позволяет выполнять прямые запросы в базу через db_query.

Вставка записи:

db_query('INSERT INTO {mytable} (value1, value2) VALUES  (%d, "%s")', $int, $string);

Обновление записи:

db_query('UPDATE {mytable} SET value2 = "%s" WHERE value1 = %d', $new_string, $int);

Однако хорошим тоном является использование функции из Drupal API drupal_write_record.

УрокОбработка большого количества данных с помощью Queue API

В жизни каждого программиста попадаются заказчики, которые просят сделать для их сайта обработку большого количества данных, будь то постоянное обновление товаров для магазина, парсинг xml файлов, отправка десятков тесяч емейлов и так далее. Смысл в том, что решить задачу "в лоб" просто невозможно - сервер может не выдержать; или закончится время выполнения скрипта и обработка данных прервётся; или же (в случае рассылки емейлов) ляжет почтовый сервер, или того хуже - почтовый сервер решит, что вы спамер, и ваши письма будут доходить до адресатов с большим опозданием (если вообще дойдут).

Так же заказчик, естественно, не захочет каждый день заходить на сайт и нажимать какие-то кнопки, чтобы сайт крутился. Поэтому основной задачей в данной ситуации является невмешательно человека в жизненный цикл сайта.

УрокViews 3: сортировка результатов по длине заголовка

Если вы хотите вывести результаты во вьюсе, отсортировав их по длине заголовка, то имплементация хука hook_query_TAG_alter() поможет в этом:

<?php
/**
* Implements hook_query_TAG_alter().
*
* @param SelectQuery $query
*/
function ИМЯМОДУЛЯ_query_VIEWNAME_alter(SelectQuery $query) {
  $query->addExpression('LENGTH(node.title)', 'title_length');
  $query->orderBy('title_length', 'DESC');
}
?>

УрокViews 2: Отображение количества элементов под их выводом

При использовании пейджера в выводе вьюхи, количество элементов на странице можно вывести и вручную. Однако если выводить все элементы на одной странице, то довольно удобно показывать общее количество этих элементов под их выводом.

Если вы не боитесь использования PHP снипетов внутри вьюхи, то в настройках вьюса в подвале (footer) укажите формат ввода - php code и вставьте туда вот это:

<?php
  $current_view = views_get_current_view();
  print count($current_view->result);
?>

Это же можно сделать и другим способом. Например, через свой модуль. Для этого надо имплементировать хук hook_views_pre_render():

УрокБезопасный SQL запрос к базе данных в секции IN при работе с динамическими данными

В Друпал 6 значения, подставляемые в sql запрос могут заменяться %f, %d, %s. Однако что делать, если надо передать в запрос массив данных, который использует секцию IN? Пример:

$result = db_query('SELECT title FROM {node} WHERE nid IN (1, 10, 25)');

Если значения nid заранее известны то проблем не возникает - просто пользуемся вариантом выше и получаем профит. Однако, если количество передаваемых значений не известно, то могут возникнуть трудности. Конечно, можно было бы сделать так:

Страницы