web-dev-qa-db-ja.com

プログラムで作成されたメニューリンクの親を設定する

現在、プログラムでメニューとその中のメニューリンクを生成しています。これは機能していますが、リンクの親を設定するのに問題があります。これが私の現在のコードです

    $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());
    }

この線

var_dump($menu_link->getParentId());

実際に正しい親を表示しています。ただし、管理ページのメニューにアクセスすると、親は設定されておらず、メニューの最上位にいます。コードに特定の問題はありますか?プログラムで生成されたメニューリンクの親をどのように設定しますか?

4
Matt

親を設定するときに、「menu_link_content:」を使用するmenu_link_contentのIDを使用せず、その後にリンクのUUIDが続くことがわかります。適切にフォーマットされた親フィールドの例を次に示します。

「menu_link_content:0025c274-4db3-4745-b51e-714c998b5a50」

私はそのようにコードを修正しました

    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

これは私が最終的に使用したものです。

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