Замена функций в Drupal 8

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

Замена привычного для 6 и 7 версий кода на Drupal 8.
  1. //было
  2. variable_set('key','value')
  3.  
  4. //стало
  5. \Drupal::state()->set('key','value');
  6.  
  7.  
  8. //было
  9. variable_get('key','value')
  10.  
  11. //стало
  12. $val = \Drupal::state()->get('key');
  13.  
  14.  
  15. //было
  16. variable_del('key')
  17.  
  18. //стало
  19. $val = \Drupal::state()->delete('key');
  20.  
  21.  
  22. //и даже так ещё стало
  23. $values = [
  24. 'key' => 'value',
  25. 'key2' => 'value2'
  26. ];
  27. \Drupal::state()->setMultiple($values);
  28.  
  29. $keys = [
  30. 'key',
  31. 'key2'
  32. ];
  33. $pairs = \Drupal::state()->getMultiple($keys);
  34.  
  35. //было
  36. watchdog('type', 'message');
  37.  
  38. //стало

Применение свойств в диапазоне ширины браузера

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

Если используется устройство, ширина экрана которого находится в диапазоне 300px на 600px - то следующий набор стилей для него сработает. В противной форме - нет. Прописываем это прямо в css файле.
  1. @media screen and (min-width:300px) and (max-width:600px){
  2. a{color:red;}
  3. div.block{display:none;}
  4. }

Заметки по Drupal 8

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

Получить строчку из таблицы config
  1. //например конфиг block.block.bartik_tools
  2.  
  3. //вытянет всё
  4. $conf = \Drupal::config('block.block.bartik_tools')->get();
  5.  
  6. //покажет только элемент 'region'
  7. $conf = \Drupal::config('block.block.bartik_tools')->get('region');
  8.  
  9. //посмотреть
  10. kint($conf);
Программный вывод блока
  1. //id блока. Например system_powered_by_block,shortcuts или search_form_block
  2. $bid = 'system_powered_by_block';
  3. $block_manager = \Drupal::service('plugin.manager.block');
  4. $config = array();

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

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

Чтобы проверить вхождение одной строки в другую - следует использовать такой код. +1 используется из-за того, что вхождение может начинаться с нулевого символа строки
  1. var main_string = 'main string content';
  2. if(main_string.indexOf('string') + 1) {
  3. console.log('true');
  4. } else {
  5. console.log('false');
  6. }

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

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

Для Ubuntu
  1. sudo apt-get install atop
После этого atop будет складывать в var/log/atop снимки системы каждые 10 секунд. И если ваш сервер упадет ночью, то вы сможете утром спокойно выполнить
  1. atop -r /var/log/atop/atop_log_filename
и клавишами t и Shift+t покрутить историю. Если падение продолжалось более 10 секунд - то вы обязательно увидите что выжрало все ресурсы сервера и хотя бы станет понятнее в какую сторону копать дальше. Например я увидел, что у меня занят весь swap и дисковые операции занимают 100% ресурсов.

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

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

Забанить эту сволоту можно в к конфиге Nginx. В директории server добавьте следующий код.
  1. if ($http_user_agent ~ bingbot) {
  2. return 503;
  3. }
После этого вашему серверу полегчает. Да, не забываем сделать :
  1. service nginx reload
Потом вы можете легко проверить, работает ли данное правило.
  1. $opts = array(
  2. 'http' => array('user_agent' => 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)')
  3. );
  4. $context = stream_context_create($opts);
  5. $res = file_get_contents("your site url", false, $context);

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

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

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

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

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

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

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

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

Допустим у вас есть такая вёрстка:
  1. <input type="hidden" name="field_main_image[und][0][fid]" value="152" />
И вам нужно ява скриптом обратиться к этому инпуту по имени и забрать значение атрибута value. Делается это так.
  1. var input_value = $('[name=field_main_image\\[und\\]\\[0\\]\\[fid\\]]').attr('value')
Всё элементарно, но надо знать, что скобки экранируются двумя слэшами, а не одним.

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

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

Периодически Друпал не подключает 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');