возможно ли создать многоуровневое меню с пакетом knpmenu для symfony2, не зная, сколько уровней будет. ниже foreach
хорошо, если будет максимум 2 уровня
class MenuRepository
public function getMenuItems()
{
return $this->findBy(array('active' => '1'), array('parent' => 'ASC', 'order' => 'ASC'));
}
}
class Builder extends ContainerAware
{
$menuItems = $em->getRepository('AcmeBundle:Menu')->getMenuItems();
foreach ($menuItems as $key => $item) {
if ($item->getParent() == null) {
$menu->addChild($item->getId(),
array(
'route' => $item->getRoute().'_display',
'label' => $item->getTitle(),
'routeParameters' => array('slug' => $item->getParametry())));
} else {
if (isset($menu[$item->getParent()->getId()] )) {
$menu[$item->getParent()->getId()]->addChild($item->getId(), array(
'route' => $item->getRoute().'_display',
'label' => $item->getTitle(),
'routeParameters' => array('slug' => $item->getParam())));
}
}
}
рекурсивная функция, которая insertChild
function insertChild($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle->getParent()->getId()===$key ||
($this->insertChild($needle ,$value->getChildren()) !== false)) {
$haystack[$key]->addChild($needle->getId(),
array(
'route' => $needle->getRoute().'_display',
'label' => $needle->getTitle(),
'routeParameters' => array('slug' => $needle->getParam())
));
return $haystack[$key];
}
}
return false;
}
Задача ещё не решена.
Других решений пока нет …