Imagine the following menu structure:
- Page 1 type: article
- Page 2 comes from a view
- Page 3 type: desirable < want this
- Page 4 type: random
- Page 5 type: random
- Page 4 type: random
- Page 3 type: desirable < want this
- Page 6 type: article
Lets say I’m on Page 5. I want to know if any parent menu item’s node has the content type desirable.
I got a menu item id menu_link_content:uuid
for Page 5. My current approach is the following:
<?php $values['menu_parent'] = 'main:menu_link_content:uuid'; list($menuName, $entityName, $uuid) = explode(':', $values['menu_parent'], 3); $menuLinkManager = Drupal::service('plugin.manager.menu.link'); $parents = $menuLinkManager->getParentIds($entityName . ':' . $uuid); foreach ($parents as $parentPluginId) { $mlc_ids = Drupal::database() ->select('menu_tree', 'mt') ->fields('mt', ['route_param_key']) ->condition('route_name', 'entity.node.canonical') ->condition('id', $parentPluginId) ->execute() ->fetchCol(); // menu_tree gives back node=nid if ($mlc_id && strpos($mlc_id, 'node=') !== false) { // split node=nid into separate values list($entityString, $nid) = explode("=", $mlc_id, 2); // load the respective node and see if it is a project $parentNode = Drupal::entityManager()->getStorage('node')->load($nid); if ($parentNode) { $parentType = $parentNode->getType(); // we found the parent project node if ('project' == $parentType) { $node->set('field_project_ref', $nid); $node->save(); drupal_set_message( t("The content was automatically added a project reference due to it's parent menu items."), 'status' ); break; } } } }
So I would go on and load the node if the database statement found something and check the node type etc. I just wonder if there was a more performant/ better, out of the box way of doing that?
Something like
$menuLinkContent->getTargetEntity()->getType()
or
entityManager()->loadEntityFromMenu()
would be nice.