it-swarm.com.de

Legen Sie das übergeordnete Element für programmgesteuert erstellte Menüverknüpfungen fest

Ich generiere derzeit programmgesteuert ein Menü und Menülinks darin. Dies funktioniert, aber ich habe Probleme, die Eltern für die Links festzulegen. Hier ist mein aktueller Code

    $langcode = 'es';
    if (empty($menu_id)) {return ['#markup' => 'menu not specified'];}
    $menu = \Drupal::entityTypeManager()->getStorage('menu')
        ->create([
            'langcode' => $langcode,
            'status' => TRUE,
            'label' => $menu_id,
            'id' => $menu_id,
            'description' => 'this menu was created programmatically',
        ])->save();

    $items = [
        '1' => 'item 1',
        '2' => 'item 2',
        '3' => 'item 3',
    ];
    $parent = NULL;
    foreach ($items as $id => $title) {
        if ($id == '2') {$parent = '1';} else { $parent == NULL;}
        $menu_link = MenuLinkContent::create([
            'title' => $title,
            'link' => ['uri' => 'internal:/node/' . $nid],
            'menu_name' => $menu_id,
            'expanded' => true,
            'langcode' => $langcode,
            'status' => TRUE,
            'parent' => $parent,
        ]);

        $menu_link->save();
        var_dump($menu_link->getParentId());
    }

Diese Linie

var_dump($menu_link->getParentId());

zeigt tatsächlich das richtige übergeordnete Element an. Beim Besuch des Menüs auf der Administrationsseite ist das übergeordnete Menü jedoch nicht festgelegt und befindet sich auf der obersten Ebene des Menüs. Gibt es ein bestimmtes Problem mit meinem Code? Wie würden Sie das übergeordnete Element eines programmgesteuert generierten Menü-Links festlegen?

4
Matt

Es stellt sich heraus, dass Sie beim Festlegen des übergeordneten Elements nicht die ID des menu_link_content verwenden, sondern den 'menu_link_content:' gefolgt von der UUID des Links. Hier ist ein Beispiel für ein ordnungsgemäß formatiertes übergeordnetes Feld.

'menu_link_content: 0025c274-4db3-4745-b51e-714c998b5a50'

Ich habe den Code so korrigiert

    foreach ($items as $id => $title) {
        if ($id == '2') {
            $parent = 'menu_link_content:' . $previous_menu_link->uuid();
        } else {
            $parent == NULL;
        }

        $menu_link = MenuLinkContent::create([
            'title' => $title,
            'link' => ['uri' => 'internal:/node/' . $nid],
            'menu_name' => $menu_id,
            'expanded' => true,
            'langcode' => $langcode,
            'status' => TRUE,
            'parent' => $parent,
        ]);

        $menu_link->save();
        $previous_menu_link = $menu_link;
    }
3
Matt

Das habe ich letztendlich benutzt.

use Drupal\menu_link_content\Entity\MenuLinkContent;

\Drupal::entityTypeManager()
  ->getStorage('menu')
  ->create([
    'id' => 'test-menu',
    'label' => 'Test menu',
    'description' => 'Description text.',
  ])
  ->save();

$menu_link_1 = MenuLinkContent::create([
  'title' => 'Link 1',
  'link' => ['uri' => 'internal:/foo'],
  'menu_name' => 'test-menu',
  'expanded' => TRUE,
]);
$menu_link_1->save();

$menu_link_2 = MenuLinkContent::create([
  'title' => 'Link 2',
  'link' => ['uri' => 'internal:/bar'],
  'menu_name' => 'test-menu',
  'expanded' => TRUE,
  'parent' => $menu_link_1->getPluginId(),
]);
$menu_link_2->save();
1
ya.teck