Установка Drupal 8

Опубликовано 2015.04.04 в разделе Drupal.

Зарождался друпал в далёком 1999 году, а активно развиваться начал уже с 2001 года. В настоящее время последней версией системы является восьмая. На начало 2015 года восьмая ветка ещё проходит бета тестирование, но уже вполне пригодна для разработки сайтов. Седьмая версия весьма стабильна, но мы не будем ориентироваться на неё, а пойдём в ногу со временем. Итак, Drupal 8.

Drupal node, как контейнер для содержимого материала

Опубликовано 2015.01.19 в разделе Drupal.

Нода, или материал - это единица контента на сайте. Любая статья, новость или заметка - это всё ноды. По умолчанию адрес каждого материала выглядит как node/<номер материала> Что нужно знать о нодах:
  • каждая нода имеет уникальный номер - nid (node id)
  • каждая нода имеет тип
  • ноды состоят из полей
  • каждая нода имеет два состояние- опубликована и не опубликована
Это основные признаки материалов на сайте. Теперь подробнее.

Drupal t или переводим друпал правильно

Опубликовано 2015.01.19 в разделе Drupal.

В друпале есть функция t. Да, именно одна буква, от слова translate, что означает перевод. Функция t принимает на вход один строковый аргумент и возвращает его, переведённый на язык сайта или язык текущего пользователя. Передавать строки в функцию t следует только на английском языке. Например, если у вас сайт на русском языке - то такой код должен вывести слово "Отмена":
  1. print t('Cancel');
Если какие-то строки не переведены - вы можете перевести их вручную в админке, по адресу admin/config/regional/translate/translate

Агрегация views по заголовку материала

Опубликовано 2014.09.25 в разделе Drupal.

Сделать традиционный group by в запросе вьюса не так просто. Вьюс группирует все поля. Для отдельных полей в настройках агрегации можно задать тип "среднее", "максимум", "минимум" и так далее. А если нужно сгруппировать материалы по строке? Например по заголовку или строковому cck полю? Стандартная агрегация вьюса с этим не справится, по крайней мере я не смог этого сделать в интерфейсе представления. Поальтерить запрос вьюса через hook_views_query_alter тоже не получится. Придётся альтерить весь запрос.

Создание своего Token`а

Опубликовано 2014.08.01 в разделе Drupal.

Расширить стандартный набор токенов очень просто. Это необходимо, если вам нужно как-то необычно формировать алиас материала. Для начала создайте модуль. Для начала в нём необходимо объявить hook_token_info. Он будет возвращать названия токенов, их описания и машинное имя токена.
  1. function my_module_token_info() {
  2. $info['tokens']['node']['my_new_token'] = array(
  3. 'name' => t('My node token'),
  4. 'description' => t('New custome node token'),
  5. );
  6. return $info;
  7. }

Программное создание node_reference поля

Опубликовано 2014.08.01 в разделе Drupal.

Добавить такое поле очень просто. Для этого подойдёт стандартный hook_form_alter. Для создания поля типа Node reference нужно создать обыкновенное текстовое поле. А чтобы текстовое поле стало с автокомплитом - в него нужно добавить путь, по которому друпал будет аяксом дергать список подходящих значений. Выглядит это так:
  1. $form['my_author'] = array(
  2. '#type' => 'textfield',
  3. '#title' => 'Автор фото',
  4. '#autocomplete_path' => 'node_reference/autocomplete/node/node_gallery_item/field_coll_photo_author',
  5. );

Color Picker для Drupal

Опубликовано 2014.07.01 в разделе Drupal.

В ядре друпала есть модуль Color, позволяющий задавать цвета различных элементов темы прямо из админки. Данный Color Picker легко вытянуть и поставить в любую друпальскую форму. Можно создать форму самому, или поальтерить существующую. Такой код добавит элемент ко всем формам, так что ориентируйтесь на переменную $form_id в теле хука.
  1. function my_module_form_alter(&$form, &$form_state, $form_id){
  2. $form['color'] = array(

Удалить все ноды определённого типа

Опубликовано 2014.06.19 в разделе Drupal.

Если у вас не стоит модуль VBO, а потребность удалить большое количество нод есть - то можно использовать совсем маленький кусок кода. Можно даже не создавать модуль, а прогнать его через Devel. Например, мне нужно удалить все материалы типа "auto_part" Код выглядит так:
  1. $nids = array();
  2. $q = db_select('node', 'n')->condition('n.type', 'auto_part')->fields('n', array('nid'))->execute();
  3. while($r = $q->fetchAssoc()) {
  4. $nids[] = $r['nid'];
  5. }
  6. node_delete_multiple($nids);

Удаление дочерних материалов Node Gallery

Опубликовано 2014.06.17 в разделе Drupal.

Модуль Node Gallery позволяет создавать на сайте галереи. Причём каждое фото одной галереи - это отдельная нода. Пересматривать такую галереи не очень удобно, так как придётся обновлять страницу, а не использовать AJAX. Но зато можно темизировать каждую страницу фото, заполнять мета тэги и повысить кликабельность сайта. Для чего это нужно - решайте сами. и нужно ли вам это вообще. Тем не менее этот модуль имеет право на существование. Однако в нём есть один недостаток, скорее баг, нежели фича.

Проблемы с check_plain

Опубликовано 2014.06.17 в разделе Drupal.

Иногда при работе с сайтом вываливаются подобного рода ошибки:
Warning: htmlspecialchars(): Invalid multibyte sequence in argument в функции check_plain() (строка 1566 в файле /includes/bootstrap.inc).
Это возникает из-за того, что в функцию
  1. htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
передана строка в кодировке, отличной от UTF-8.