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:'
。
我需要帮助才能从特定的 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:'
。