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

12.01.2020

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

src/Plugin/Derivative/TermLinksDeriver.php:

namespace Drupal\modulename\Plugin\Derivative;

use Drupal\Component\Plugin\Derivative\DeriverBase;

class TermLinksDeriver extends DeriverBase {

  /**
   * {@inheritDoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition): array {
    /** @var TermStorageInterface $term_storage */
    $term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
    /** @var \stdClass[] $terms */
    $terms = $term_storage->loadTree('category');

    foreach ($terms as $term) {
      $this->derivatives[$term->tid] = $base_plugin_definition;
      $this->derivatives[$term->tid]['title'] = $term->name;
      $this->derivatives[$term->tid]['route_name'] = 'entity.taxonomy_term.canonical';
      $this->derivatives[$term->tid]['route_parameters'] = ['taxonomy_term' => $term->tid];
      $this->derivatives[$term->tid]['weight'] = $term->weight;

      if ($term->parents[0]) {
        $this->derivatives[$term->tid]['parent'] = 'modulename.term_links:' . $term->parents[0];
      }
    }

    return parent::getDerivativeDefinitions($base_plugin_definition);
  }

}

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+
Похожие записи

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