Ссылка с html кодом в анкоре

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

В семёрке в функцию l можно было передать третьим аргументом 'html' => TRUE В восьмёрке этого нет. Вместо этого анкор ссылки надо превратить в Markup. Простой пример:
  1. //не сработает
  2. $render_image = '<img src="/my-image.png" />';
  3. $link = Link::fromTextAndUrl($render_image, $url)->toRenderable();
  4.  
  5. //сработает
  6. $render_image = Markup::create('<img src="/my-image.png" />');
  7. $link = Link::fromTextAndUrl($render_image, $url)->toRenderable();

Программно вывести пресет изображения в Drupal 8

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

Предположим что нам известен id файла изображения.
  1. //не забываем
  2. use Drupal\file\Entity\File;
  3.  
  4.  
  5. $file = File::load($image_id);
  6. $variables = array(
  7. 'style_name' => 'thumbnail',
  8. 'uri' => $file->getFileUri(),
  9. );
  10. $image = \Drupal::service('image.factory')->get($variables['uri']);
  11. if ($image->isValid()) {
  12. $variables['width'] = $image->getWidth();
  13. $variables['height'] = $image->getHeight();
  14. }
  15. else {
  16. $variables['width'] = $variables['height'] = NULL;
  17. }
  18. $preset = [
  19. '#theme' => 'image_style',
  20. '#width' => $variables['width'],

MENU_CALLBACK в Drupal 8

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

Бывает что нужно вывести на страницу только конкретный текст, без всей обёртки страницы. Если не использовать hook_menu в Drupal 8, то в методе контроллера, отвечающего за рендер страницы следует писать так:
  1. //с обёрткой
  2. return [
  3. '#type' => 'markup',
  4. '#markup' => $this->t('Content of page')
  5. ];
  6.  
  7. //без обёртки(аналог MENU_CALLBACK)
  8. return new Response('Content of page');
  9.  
  10. //тоже самое, только будет жёстко кэшироваться.
  11. return new HtmlResponse('Content of page');
  12.  
  13. //Не забываем
  14. use Symfony\Component\HttpFoundation\Response;

Замена функций в 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. //стало

Заметки по 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();

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

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

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

Почему не срабатывает 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');

Создание новостного блока в Drupal 8

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

Вначале напишем задачу и будем поэтапно её решать:
  • 1. Необходимо создать на сайте новости.
  • 2. В новости помимо текста должна быть картинка.
  • 3. Комментировать новости запрещено.
  • 4. Новости должны сохраняться в разделах "Политика", "Экономика", "События" и "Разное".
  • 5. Вывести блок из последних 5 новостей. В блоке должна быть маленькая картинка новости, заголовок и дата публикации.
Решение: Вначале нужно создать материал типа "Новости". Я уже объяснял ка создать тип материала, поэтому расскажу вкратце.

Установка модулей в Drupal 8

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

Ранее я уже вкратце говорил что такое модуль, для чего он нужен и где его следует хранить. Давайте установим свой первый модуль. Пусть это будет модуль Devel https://www.drupal.org/project/devel Качайте zip архив для 8 версии, распаковывайте и сохраняйте в sites/all/modules. Папок all и modules у вас нет-создавайте их. В свежих версиях друпала кидайте модули сразу в папку modules. Выглядеть у вас это должно вот так: установка Drupal 8

Расположение блоков на странице в Drupal 8

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

Чтобы разместить блоки на сайте-заходит в Структура->Схема блоков Как я уже говорил - в теме определены регионы, в нашем случае это регионы с именами Шапка,Primary menu,Дополнительные ссылки и так далее. Чтобы понять, где эти регионы находятся - жмите на "Demonstrate block regions" установка Drupal 8 В таком предпросмотре вы сразу сориентируетесь в какой регион вам нужно добавить блок, чтобы он попал в правую колонку, в левую или в подвал.