entity_hierarchy-8.x-2.24/modules/entity_hierarchy_microsite/src/MicrositeMenuLinkDiscovery.php
modules/entity_hierarchy_microsite/src/MicrositeMenuLinkDiscovery.php
<?php
namespace Drupal\entity_hierarchy_microsite;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Menu\Form\MenuLinkDefaultForm;
use Drupal\Core\Menu\MenuTreeStorage;
use Drupal\entity_hierarchy\Information\ParentCandidateInterface;
use Drupal\entity_hierarchy\Storage\EntityTreeNodeMapperInterface;
use Drupal\entity_hierarchy\Storage\NestedSetNodeKeyFactory;
use Drupal\entity_hierarchy\Storage\NestedSetStorageFactory;
use Drupal\entity_hierarchy_microsite\Entity\MicrositeInterface;
use Drupal\entity_hierarchy_microsite\Form\MicrositeMenuItemForm;
use Drupal\entity_hierarchy_microsite\Plugin\Menu\MicrositeMenuItem;
/**
* Defines a class for microsite menu link discovery.
*/
class MicrositeMenuLinkDiscovery implements MicrositeMenuLinkDiscoveryInterface {
/**
* Set storage.
*
* @var \Drupal\entity_hierarchy\Storage\NestedSetStorageFactory
*/
protected $nestedSetStorageFactory;
/**
* Mapper.
*
* @var \Drupal\entity_hierarchy\Storage\EntityTreeNodeMapperInterface
*/
protected $mapper;
/**
* Parent candidate.
*
* @var \Drupal\entity_hierarchy\Information\ParentCandidateInterface
*/
protected $candidate;
/**
* Field manager.
*
* @var \Drupal\Core\Entity\EntityFieldManagerInterface
*/
private $entityFieldManager;
/**
* Type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
private $entityTypeManager;
/**
* Key factory.
*
* @var \Drupal\entity_hierarchy\Storage\NestedSetNodeKeyFactory
*/
private $keyFactory;
/**
* The module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a new MicrositeMenuItemDeriver.
*
* @param \Drupal\entity_hierarchy\Storage\NestedSetStorageFactory $nestedSetStorageFactory
* Storage.
* @param \Drupal\entity_hierarchy\Storage\EntityTreeNodeMapperInterface $mapper
* Mapper.
* @param \Drupal\entity_hierarchy\Information\ParentCandidateInterface $candidate
* Candidate.
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager
* Field manager.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
* Type manager.
* @param \Drupal\entity_hierarchy\Storage\NestedSetNodeKeyFactory $keyFactory
* Key factory.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
* The module handler.
*/
public function __construct(NestedSetStorageFactory $nestedSetStorageFactory, EntityTreeNodeMapperInterface $mapper, ParentCandidateInterface $candidate, EntityFieldManagerInterface $entityFieldManager, EntityTypeManagerInterface $entityTypeManager, NestedSetNodeKeyFactory $keyFactory, ModuleHandlerInterface $moduleHandler) {
$this->nestedSetStorageFactory = $nestedSetStorageFactory;
$this->mapper = $mapper;
$this->candidate = $candidate;
$this->entityFieldManager = $entityFieldManager;
$this->entityTypeManager = $entityTypeManager;
$this->keyFactory = $keyFactory;
$this->moduleHandler = $moduleHandler;
}
/**
* {@inheritdoc}
*/
public function getMenuLinkDefinitions(?MicrositeInterface $microsite = NULL) {
$definitions = [];
$microsites = $microsite ? [$microsite] : $this->entityTypeManager->getStorage('entity_hierarchy_microsite')->loadMultiple();
/** @var \Drupal\entity_hierarchy_microsite\Entity\MicrositeInterface $microsite */
foreach ($microsites as $microsite) {
$home = $microsite->getHome();
$generate_menu = $microsite->shouldGenerateMenu();
if (!$home || !$generate_menu) {
continue;
}
$key = $this->keyFactory->fromEntity($home);
$parentUuids = [];
foreach ($this->candidate->getCandidateFields($home) as $field_name) {
/** @var \PNX\NestedSet\NestedSetInterface $tree */
$tree = $this->nestedSetStorageFactory->get($field_name, 'node');
$homeNode = $tree->getNode($key);
if (!$homeNode) {
// No children.
continue;
}
$nodes = $this->mapper->loadEntitiesForTreeNodesWithoutAccessChecks('node', $tree->findDescendants($key));
$url = $home->toUrl();
$definitions[$home->uuid()] = [
'class' => MicrositeMenuItem::class,
'menu_name' => 'entity-hierarchy-microsite',
'route_name' => $url->getRouteName(),
'route_parameters' => $url->getRouteParameters(),
'options' => $url->getOptions(),
'title' => $home->label(),
'description' => '',
'weight' => $homeNode->getLeft(),
'id' => 'entity_hierarchy_microsite:' . $home->uuid(),
'metadata' => [
'entity_id' => $home->id(),
'entity_hierarchy_depth' => $homeNode->getDepth(),
],
'form_class' => MenuLinkDefaultForm::class,
'enabled' => 1,
'expanded' => 1,
'provider' => 'entity_hierarchy_microsite',
'discovered' => 1,
];
/** @var \PNX\NestedSet\Node $treeNode */
foreach ($nodes as $treeNode) {
if (!$nodes->contains($treeNode) || $treeNode->getDepth() >= MenuTreeStorage::MAX_DEPTH) {
continue;
}
/** @var \Drupal\node\NodeInterface $item */
$item = $nodes->offsetGet($treeNode);
$url = $item->toUrl();
$revisionKey = sprintf('%s:%s', $treeNode->getId(), $treeNode->getRevisionId());
$itemUuid = $item->uuid();
$parentUuids[$revisionKey] = $itemUuid;
if ($definition = $microsite->modifyMenuPluginDefinition($treeNode, $item, [
'class' => MicrositeMenuItem::class,
'menu_name' => 'entity-hierarchy-microsite',
'route_name' => $url->getRouteName(),
'route_parameters' => $url->getRouteParameters(),
'options' => $url->getOptions(),
'title' => $item->label(),
'description' => '',
'weight' => $treeNode->getLeft(),
'id' => 'entity_hierarchy_microsite:' . $itemUuid,
'metadata' => [
'entity_id' => $item->id(),
'entity_hierarchy_depth' => $treeNode->getDepth(),
],
'form_class' => MenuLinkDefaultForm::class,
'enabled' => 1,
'expanded' => 1,
'provider' => 'entity_hierarchy_microsite',
'discovered' => 1,
'parent' => 'entity_hierarchy_microsite:' . $home->uuid(),
], $homeNode)) {
$definitions[$itemUuid] = $definition;
$parent = $tree->findParent($treeNode->getNodeKey());
if ($parent && ($parentRevisionKey = sprintf('%s:%s', $parent->getId(), $parent->getRevisionId())) && array_key_exists($parentRevisionKey, $parentUuids)) {
$definitions[$itemUuid]['parent'] = 'entity_hierarchy_microsite:' . $parentUuids[$parentRevisionKey];
}
}
}
}
/** @var \Drupal\entity_hierarchy_microsite\Entity\MicrositeMenuItemOverrideInterface $override */
if ($definitions) {
foreach ($this->entityTypeManager->getStorage('eh_microsite_menu_override')
->loadByProperties([
'target' => array_keys($definitions),
]) as $override) {
$original = $definitions[$override->getTarget()];
$definitions[$override->getTarget()] = [
'metadata' => [
'original' => array_intersect_key($original, [
'title' => TRUE,
'weight' => TRUE,
'enabled' => TRUE,
'expanded' => TRUE,
'parent' => TRUE,
]),
] + $original['metadata'],
'title' => $override->label(),
'form_class' => MicrositeMenuItemForm::class,
'weight' => $override->getWeight(),
'enabled' => $override->isEnabled(),
'expanded' => $override->isExpanded(),
'parent' => $override->getParent(),
] + $original;
}
}
}
$this->moduleHandler->alter('entity_hierarchy_microsite_links', $definitions);
return $definitions;
}
}
