function _menu_ui_node_save

Same name in other branches
  1. 9 core/modules/menu_ui/menu_ui.module \_menu_ui_node_save()
  2. 8.9.x core/modules/menu_ui/menu_ui.module \_menu_ui_node_save()
  3. 10 core/modules/menu_ui/menu_ui.module \_menu_ui_node_save()

Helper function to create or update a menu link for a node.

Parameters

\Drupal\node\NodeInterface $node: Node entity.

array $values: Values for the menu link.

2 calls to _menu_ui_node_save()
LayoutBuilderContentModerationIntegrationTest::testLayoutModeration in core/modules/content_moderation/tests/src/Functional/LayoutBuilderContentModerationIntegrationTest.php
Tests that Layout changes are respected by Content Moderation.
menu_ui_form_node_form_submit in core/modules/menu_ui/menu_ui.module
Form submission handler for menu item field on the node form.

File

core/modules/menu_ui/menu_ui.module, line 20

Code

function _menu_ui_node_save(NodeInterface $node, array $values) {
    
    /** @var \Drupal\menu_link_content\MenuLinkContentInterface $entity */
    if (!empty($values['entity_id'])) {
        $entity = \Drupal::service('entity.repository')->getActive('menu_link_content', $values['entity_id']);
        if ($entity->isTranslatable() && $node->isTranslatable()) {
            if (!$entity->hasTranslation($node->language()
                ->getId())) {
                $entity = $entity->addTranslation($node->language()
                    ->getId(), $entity->toArray());
            }
            else {
                $entity = $entity->getTranslation($node->language()
                    ->getId());
            }
        }
        else {
            // Ensure the entity matches the node language.
            $entity = $entity->getUntranslated();
            $entity->set($entity->getEntityType()
                ->getKey('langcode'), $node->language()
                ->getId());
        }
    }
    else {
        // Create a new menu_link_content entity.
        $entity = MenuLinkContent::create([
            'link' => [
                'uri' => 'entity:node/' . $node->id(),
            ],
            'langcode' => $node->language()
                ->getId(),
        ]);
        $entity->enabled->value = 1;
    }
    $entity->title->value = trim($values['title']);
    $entity->description->value = trim($values['description']);
    $entity->menu_name->value = $values['menu_name'];
    $entity->parent->value = $values['parent'];
    $entity->weight->value = $values['weight'] ?? 0;
    if ($entity->isNew()) {
        // @todo The menu link doesn't need to be changed in a workspace context.
        //   Fix this in https://www.drupal.org/project/drupal/issues/3511204.
        if (!$node->isDefaultRevision() && $node->hasLinkTemplate('latest-version')) {
            // If a new menu link is created while saving the node as a pending draft
            // (non-default revision), store it as a link to the latest version.
            // That ensures that there is a regular, valid link target that is
            // only visible to users with permission to view the latest version.
            $entity->get('link')->uri = 'internal:/node/' . $node->id() . '/latest';
        }
    }
    else {
        $entity->isDefaultRevision($node->isDefaultRevision());
        if (!$entity->isDefaultRevision()) {
            $entity->setNewRevision(TRUE);
        }
        elseif ($entity->get('link')->uri !== 'entity:node/' . $node->id()) {
            $entity->get('link')->uri = 'entity:node/' . $node->id();
        }
    }
    $entity->save();
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.