Пример программного наполнения меню 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+
Добавить комментарий