xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Программно наполнить меню ссылками на термины таксономии

Опубликовано в

Пример программного наполнения меню main ссылками на категории из словаря category (повторение функционала модуля Taxonomy Menu).

src/Plugin/Derivative/TermLinksDeriver.php:

class TermLinksDeriver extends DeriverBase {
 
  /**
   * {@inheritDoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition) {
    /** @var TermStorageInterface $term_storage */
    $term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
    /** @var \stdClass[] $terms */
    $terms = $term_storage->loadTree('category');
    $links = [];
 
    foreach ($terms as $term) {
      $links[$term->tid] = [
        'title' => $term->name,
        'route_name' => 'entity.taxonomy_term.canonical',
        'route_parameters' => ['taxonomy_term' => $term->tid],
        'weight' => $category->weight,
      ] + $base_plugin_definition;
 
      if ($term['parents'][0]) {
        $links[$term->tid]['parent'] = 'modulename.term_links:' . $term['parents'][0];
      }
    }
 
    return $links;
  }
 
}

modulename.links.menu.yml:

modulename.term_links:
  deriver: \Drupal\modulename\Plugin\Derivative\TermLinksDeriver
  menu_name: main

Результаты getDerivativeDefinitions() кэшируются, поэтому после добавления/удаления/изменения терминов в словаре category нужно делать полный сброс кэша или программно перестраивать меню с помощью вызова:

\Drupal::cache('menu')->invalidateAll();
\Drupal::service('plugin.manager.menu.link')->rebuild();

Подробнее про деривативы можно почитать у никлана.

Написанное актуально для Drupal 8
Похожие записи

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании