Как мне связать связь с веточкой для определенного типа контента?

Я пытаюсь создать собственный файл-link.html.twig для определенного типа контента. Я просмотрел https://www.drupal.org/node/2354645 , который не " t link plugin темы, такие как file-link, но в любом случае пробовал file-link--<CONTENTYPE>.html.twig. Это не работает.

Ни одна из переданных переменных не включает узел или тип содержимого. Любые идеи о том, как действовать?

4 голоса | спросил Nic 28 Maypm16 2016, 17:16:01

3 ответа


7

Чтобы выполнить это, вам нужно сделать несколько вещей.

  1. Включение отладки Twig
  2. Создать функцию препроцесса темы для темы
  3. Получить объект узла внутри вашей темы.
  4. Нарисуйте предложение крючка темы, чтобы получить имя шаблона с типом узла в нем.

После того, как включена отладка Twig, вы можете проверить свою ссылку на файл. По умолчанию для file_link я вижу:

<!-- THEME DEBUG -->
<!-- THEME HOOK: 'file_link' -->
<!-- BEGIN OUTPUT from 'core/themes/classy/templates/field/file-link.html.twig' -->

В моем случае я использую Classy в качестве базовой темы для моей подтемы, таким образом, классный путь выше. но здесь отсутствует какая-либо полезная тема. Затем мы исправим это.

Так как нам дано имя крючка темы выше, я могу создать предложение крюка темы на основе этого и получить тип узла и включить его в предложение крючка темы. (см. функция hook_theme_suggestions_HOOK_alter )

Мое изменение темы темы:

  function MYTHEME_theme_suggestions_file_link_alter(&$suggestions, $vars, $hook) {

  // Get the node type.
  $node = \Drupal::routeMatch()->getParameter('node');
  $type = $node->getType();

  // Create the theme hook suggestion. 
  $suggestions[] = 'file__link__' . 'type_' . $type;

}

Как только я это сделаю и drush cr, я увижу новое предложение шаблона шаблона темы как таковое:

<!-- THEME DEBUG -->
    <!-- THEME HOOK: 'file_link' -->
<!-- FILE NAME SUGGESTIONS:
   * file--link--type-news.html.twig
   x file-link.html.twig
-->

В моем случае мой тип узла - «Новости», и вы можете увидеть это в имени предложения шаблона:

file--link--type-news.html.twig

Теперь вы можете создать этот файл и тему прочь! Для получения дополнительной информации об этом, я просто написал сообщение в блоге об этом: Drupal 8 Theming Tutorial: Как создать специальные предложения и шаблоны для тематических сюжетов

ответил Danny Englander 28 Maypm16 2016, 20:24:15
1

У вас есть отличный ответ от @ Danny-Englander, как получить предложение темы для ветки. Но я думаю, что вопрос слишком узкий, он должен быть шире, без веточки:

Как создать тему ссылки на файл для определенного типа контента?

Чтобы сделать это, поместите класс с типом контента в тег <article> в ветке узла и класс для ссылки на файл в file_link. Затем используйте css, чтобы выбрать все ссылки на файлы внутри этого тега статьи. Вы можете использовать одни и те же селекторы для javascript.

Если вы используете стильную тему, вы уже должны установить классы.

Причиной этого является то, что узел может отображаться по-разному. Например, в качестве ссылки на сущность или внутри представления. Тогда вы получите неправильный routeMatch или noMatchMatch вообще. Используя тег статьи, вы можете справиться с этой гибкостью. Вы можете иметь несколько узлов на одной странице, и все могут иметь разные типы контента.

ответил 4k4 29 Mayam16 2016, 11:03:46
1

Я нашел решение, которое работало в этой ситуации, и поэтому отправляю его для дальнейшего использования.

Я добавил это в наш пользовательский модуль:

/**
 * Implements hook_template_preprocess_default_variables_alter().
 */
function MYMODULE_template_preprocess_default_variables_alter(&$variables) {

  /** @var Node $node */
  $node = Drupal::routeMatch()->getParameter('node');
  if ($node) {
    $variables['nid'] = $node->id();
    $variables['node_type'] = $node->getType();
  }

}

затем взял копию file-link.html.twig в нашу пользовательскую тему и добавил:

{% if (node_type == 'CONTENTTYPE') %}
    <a class="filelink" href="{{ link.url }}" title="{{ description }}">
        <img src="/const8/img/icon-pdf-128.png" alt="Download PDF" title="" class="img-responsive" style="float:right;">Download PDF
        <span class="visible-xs-inline-block">({{ file_size }})</span></a>
{% else %}
  {# All other content types.... #}
ответил Nic 30 Mayam16 2016, 11:49:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132