web-dev-qa-db-fra.com

Définir le parent pour les liens de menu créés par programme

Je génère actuellement par programme un menu et des liens de menu à l'intérieur. Cela fonctionne, mais j'ai du mal à définir les parents pour les liens. Voici mon code actuel

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

Cette ligne

var_dump($menu_link->getParentId());

affiche en fait le bon parent. Mais lorsque vous visitez le menu dans la page d'administration, le parent n'est pas défini et se trouve au niveau supérieur du menu. Y a-t-il un problème spécifique avec mon code? Comment définiriez-vous le parent d'un lien de menu généré par programme?

4
Matt

Il s'avère que lors de la définition du parent, vous n'utilisez pas l'ID du menu_link_content, vous utilisez le 'menu_link_content:' suivi de l'uuid du lien. Voici un exemple de champ parent correctement formaté.

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

J'ai corrigé le code comme ça

    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

C'est ce que j'ai fini par utiliser.

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