DataBase API в Drupal 8

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

API в восьмёрке очень похоже на API.
  1. //не забываем
  2. use Drupal\Core\Database\Database;
  3. use Drupal\Core\Database\Query\Select;
  4.  
  5. //далее просто пример моего запроса
  6. $connection = Database::getConnection();
  7. $sql = new Select('node__field_tags', 'ft', $connection);
  8. $sql->condition('field_tags_target_id', $tids, 'in');
  9. $sql->leftJoin('taxonomy_term_field_data', 'tfd', 'tfd.tid=ft.field_tags_target_id');
  10. $sql->leftJoin('node_field_data','nfd', 'nfd.nid=ft.entity_id');
  11. $sql->fields('ft', array('field_tags_target_id', 'entity_id'));
  12. $sql->fields('tfd', array('name'));

Шаблон для field и fields во вьюсе для Drupal 8

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

Информацию о шаблонах из интерфейса вьюса успешно выпилили(надеюсь не навсегда). Чтобы сделать шаблон для поля - добавьте следующий хук:
  1. function template_preprocess_views_view_field(&$vars) {
  2. $field_id = $vars['field']->options['id'];
  3. $views_name = $vars['view']->id();
  4. $display_name = $vars['view']->getDisplay()->display['id'];
  5. $vars['theme_hook_original'] = 'views_view_field__' . $views_name . '__' . $display_name . '__' . $field_id;
  6. }
для полей
  1. function template_preprocess_views_view_fields(&$vars) {
  2. $views_name = $vars['view']->id();

Подключение css в Drupal 8

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

В файлах module_name.libraries.yml css подключается немного сложнее, чем js. Пример:
  1. map_render:
  2. js:
  3. js/infobox.js: {}
  4. js/markerclusterer.js: {}
  5. js/map_render.js: {}
  6. css:
  7. base:
  8. css/map_base.css: {}
  9. layout:
  10. css/map_layout.css: {}
  11. component:
  12. css/map_component.css: {}
  13. state:
  14. css/map_state.css: {}
  15. theme:
  16. css/map_theme.css: {}
Конкретно в этом случае все css подключатся в порядке добавления, одна происходит это за счёт веса их родительского раздела. Веса следующие:

    Ссылка с 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();

    Команды в Twig

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

    Аналог print_r для шаблона twig
    1. {{ dump(array) }}
    Для обхода массива - аналог foreach Я сразу обхожу вложенный ассоциативный массив articles
    1. {% for article_i,article in articles %}
    2. Article key : {{ article_i }}
    3. Article Value : {{ article }}
    4. {% for key,value in article %}
    5. Key : {{ key }}
    6. Value : {{ value }}
    7. {% endfor %}
    8. {% endfor %}
    Закомментировать код
    1. {# code #}
    php`шный !empty
    1. {% if field is not empty %}
    2. {{ field }}
    3. {% endif %}

    Программно вывести пресет изображения в 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. //стало

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

    Опубликовано 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. }