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

12.01.2020

Пример программного наполнения меню 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
Похожие записи

Добавить комментарий