php Drupal 8 - MenuLinkContent通过loadByProperties获取所有子项

4dc9hkyq  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(101)

我需要帮助以获取特定MenuLinkContent的所有MenuLinkContent子项,但找不到解决方案。我试过几种不同的方法,但都没有成功。
下面是我的代码:

//get all MenuLinkContent published with name 'myname'
$main_menu = \Drupal::entityTypeManager()->getStorage('menu_link_content')
      ->loadByProperties(['menu_name' => 'myname' , 'enabled' => 1]);

foreach ($main_menu as $menu) {
  //could not find a better solution, so i have to check if parent is empty.
  if ($menu->getParentId()=='') {
    //here i'm triyng to get all children, 
    $child_menu = \Drupal::entityTypeManager()->getStorage('menu_link_content')
          ->loadByProperties(['menu_name' => 'myname',  'parent' => $menu ]);

正如你所看到的,属性“parent”不适合“$menu”。我尝试了几个不同的属性从'$menu',似乎没有一个匹配我的查询。
如果需要更多的信息,只是问,我会在这里发布。实现这种迭代的其他方法也是受欢迎的。
先谢了。

f87krz0w

f87krz0w1#

找到了,从@Slim找到了这段代码,运行良好:
下面的代码取自这个答案https://drupal.stackexchange.com/a/224786/89808
“我已经很晚了,但也许可以帮助某人寻找答案,这是我从菜单项生成递归数组的解决方案。

private function generateSubMenuTree(&$output, &$input, $parent = FALSE) {
$input = array_values($input);
foreach($input as $key => $item) {
  //If menu element disabled skip this branch
  if ($item->link->isEnabled()) {
    $key = 'submenu-' . $key;
    $name = $item->link->getTitle();
    $url = $item->link->getUrlObject();
    $url_string = $url->toString();

    //If not root element, add as child
    if ($parent === FALSE) {
      $output[$key] = [
        'name' => $name,
        'tid' => $key,
        'url_str' => $url_string
      ];
    } else {
      $parent = 'submenu-' . $parent;
      $output['child'][$key] = [
        'name' => $name,
        'tid' => $key,
        'url_str' => $url_string
      ];
    }

    if ($item->hasChildren) {
      if ($item->depth == 1) {
        $this->generateSubMenuTree($output[$key], $item->subtree, $key);
      } else {
        $this->generateSubMenuTree($output['child'][$key], $item->subtree, $key);
      }
    }
  }
}

并调用该函数,

//Get drupal menu
$sub_nav = \Drupal::menuTree()->load('sub-navigation', new \Drupal\Core\Menu\MenuTreeParameters());
//Generate array
$this->generateSubMenuTree($menu_tree2, $sub_nav);
unhi4e5o

unhi4e5o2#

一个简单而直接的解决方案,从问题中修复代码:

// load all MenuLinkContent published with name 'myname'
  $main_menu = \Drupal::entityTypeManager()
    ->getStorage('menu_link_content')
    ->loadByProperties(['menu_name' => 'myname', 'enabled' => 1]);
    
  foreach ($main_menu as $menu) {
    if ($menu->getParentId()=='') {
      // load all children
      $child_menu = \Drupal::entityTypeManager()
        ->getStorage('menu_link_content')
        ->loadByProperties([
          'menu_name' => 'myname', 
          'enabled' => 1, 
          'parent' =>  'menu_link_content:' . $menu->uuid(),
      ]); 
    }
  }

引用父对象的正确方法是通过UUID,前缀为'menu_link_content:'

相关问题