Drupal 8 - MenuLinkContent 通过 loadByProperties 获取所有 children

Drupal 8 - MenuLinkContent get all children via loadByProperties

我需要帮助才能从特定的 MenuLinkContent 获取所有 MenuLinkContent children,但找不到解决方案。我尝试了几种不同的方法,但都没有成功。

这是我的代码:

//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”中的几个不同属性,但似乎没有一个符合我的查询。

如果需要更多信息,请直接询问,我会 post 在这里。 也欢迎其他实现此迭代的方法。

提前致谢。

知道了,从 @Slim 找到了这段代码并且工作正常:

以下代码取自此答案 https://drupal.stackexchange.com/a/224786/89808

"I'm quite late, but maybe helps someone looking for answers, here's my solution for generating recursive array from menu items." @Slim

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);

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

// 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:'