Создание сайта на Drupal 8

В этой серии статей мы разберем основы Drupal 8, начиная от установки и заканчивая небольшим практическим заданием. На данный момент(апрель 2015) восьмёрка ещё сыровата и модулей для неё мало, но знакомиться с ней уже давно пора.
Если вы ещё не работали с Drupal - лучше начинайте с 8, пока научитесь и поймёте что там к чему - система будет гораздо стабильнее.

Разработка модулей для Drupal 7

В этом цикле статей я расскажу вам об основных аспектах разработки модулей для Drupal 7.

Заметки по Drupal 8

Тэги:

Получить строчку из таблицы config

//например конфиг block.block.bartik_tools
 
//вытянет всё
$conf = \Drupal::config('block.block.bartik_tools')->get();
 
//покажет только элемент 'region'
$conf = \Drupal::config('block.block.bartik_tools')->get('region');
 
//посмотреть
kint($conf);

Программный вывод блока

//id блока. Например system_powered_by_block,shortcuts или search_form_block
$bid = 'system_powered_by_block';
$block_manager = \Drupal::service('plugin.manager.block');
$config = array();

Вхождение подстроки в JavaScript

Тэги:

Чтобы проверить вхождение одной строки в другую - следует использовать такой код.
+1 используется из-за того, что вхождение может начинаться с нулевого символа строки

var main_string = 'main string content';
if(main_string.indexOf('string') + 1) {
  console.log('true');
} else {
  console.log('false');
}

Логирование системы(что делать, если сервер упал вчера)

Для Ubuntu

sudo apt-get install atop

После этого atop будет складывать в var/log/atop снимки системы каждые 10 секунд.
И если ваш сервер упадет ночью, то вы сможете утром спокойно выполнить
atop -r /var/log/atop/atop_log_filename

и клавишами t и Shift+t покрутить историю. Если падение продолжалось более 10 секунд - то вы обязательно увидите что выжрало все ресурсы сервера и хотя бы станет понятнее в какую сторону копать дальше.
Например я увидел, что у меня занят весь swap и дисковые операции занимают 100% ресурсов.

Забанить бота bingbot

Забанить эту сволоту можно в к конфиге Nginx.
В директории server добавьте следующий код.

if ($http_user_agent ~ bingbot) {
    return 503;
}

После этого вашему серверу полегчает.
Да, не забываем сделать :
service nginx reload

Потом вы можете легко проверить, работает ли данное правило.
$opts = array(
 'http' => array('user_agent' => 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)')
);
$context = stream_context_create($opts);
$res = file_get_contents("your site url", false, $context);

Разбить строку по последнему пробелу

Тэги:

Допустим у нас есть строка

$content = 'В CMS Drupal есть много типов материалов, которые можно расширить полями различных типов.';

И стоит задача разбить строку на две подстроки по последнему пробелу.
Сразу напрашивается следующий код, но он не работает:
$content = preg_split("/[\s]{1}/", $content); 

По идее он должен разбить строку по первому пробелу, но разбивает он её по всем пробелам.

Придётся пойти более сложным путём, а именно:

//развернем строку задом наперед(реверс)

Views добавить group by для одного поля

Тэги:

В админке вьюсов группировка(называется агрегацией) отвратительная. Группирует все поля, а толку ноль. Уникализация выборки тоже не работает.
Классическая ситуация. Вывод нескольких материалов(например блог) и одного приаттаченного материала к каждому блогу(через entity reference). И если к блогу привязано например 3 материала - то благодаря join в запросе это блог будет выведен трижды.
Чтобы это побороть - нужно поальтерить запрос:

/**
 * Implements hook_query_alter().
 */
function mymodule_query_alter(QueryAlterableInterface $query) {

Селектор по атрибуту с [] в значении

Тэги:

Допустим у вас есть такая вёрстка:

<input type="hidden" name="field_main_image[und][0][fid]" value="152">

И вам нужно ява скриптом обратиться к этому инпуту по имени и забрать значение атрибута value.
Делается это так.
var input_value = $('[name=field_main_image\\[und\\]\\[0\\]\\[fid\\]]').attr('value')

Всё элементарно, но надо знать, что скобки экранируются двумя слэшами, а не одним.

Почему не срабатывает drupal_add_js

Тэги:

Периодически Друпал не подключает js файл, хотя вы корректно его подключили, файл физически существует и у него выставлены правильные права.
Гугл вам не скажет почему у вас не работает, а только 10 раз покажет одни и те же способы подключения js к форме, странице или блоку.
Приведу простой пример.
Допустим модуль best_form подключает js и css файлы к форме редактирования материала, путем альтера формы:

function best_form_form_node_form_alter(&$form, &$form_state)
{
    $form['#attached']['css'] = array(drupal_get_path('module', 'best_form') . '/theme/best.css');