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.