Comments 6
Сейчас затестим
Чем мне не нравится Symfony (Хотя она мне, конечно, нравися), так это тем, что для, вроде бы, простых действий вроде меню, нужно писать столько кода. Сейчас пишу на Silex, все в разы быстрее получается.
Понимаете, тут даже не в кол-ве кода дело. Мне кажется, что используя такой код (его правда не много, просто в статье так кажется) мы действительно получаем очень гибкую систему. Возможно мои писательские способности меня тут подвели и статья должна была быть гораздо мень чем есть, тем не менее я постарался как можно более подробно рассмотреть вопрос, оставив без внимания некие моменты.
Поигрался с меню, сделал пару телодвижений, а именно:
1) Добавил в сущность «Menu» следующее:
2) Изменил Builder:
В результате получилось вложенное меню:

А на фронтенде в моем случае отображается так:

1) Добавил в сущность «Menu» следующее:
src/Common/MenuBundle/Entity/Menu.php
/**
* @ORM\ManyToOne(targetEntity="Menu", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Menu", mappedBy="parent")
*/
private $children;
/**
* Constructor
*/
public function __construct()
{
$this->children = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Set parent
*
* @param \Common\MenuBundle\Entity\Menu $parent
* @return Menu
*/
public function setParent(\Common\MenuBundle\Entity\Menu $parent = null)
{
$this->parent = $parent;
return $this;
}
/**
* Get parent
*
* @return \Common\MenuBundle\Entity\Menu
*/
public function getParent()
{
return $this->parent;
}
/**
* Add children
*
* @param \Common\MenuBundle\Entity\Menu $children
* @return Menu
*/
public function addChildren(\Common\MenuBundle\Entity\Menu $children)
{
$this->children[] = $children;
return $this;
}
/**
* Remove children
*
* @param \Common\MenuBundle\Entity\Menu $children
*/
public function removeChildren(\Common\MenuBundle\Entity\Menu $children)
{
$this->children->removeElement($children);
}
/**
* Get children
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getChildren()
{
return $this->children;
}
2) Изменил Builder:
src/Common/MenuBundle/Menu/Builder.php
public function mainMenu(FactoryInterface $factory, array $options)
{
$menuItems = $this->container->get('menu')->getMainMenu();
$menu = $factory->createItem('root');
$this->setCurrentItem($menu);
$menu->setChildrenAttribute('class', 'nav nav-justified');
$menu->setExtra('currentElement', 'active');
foreach($menuItems as $item) {
if ($item->getParent()) {
$em = $this->container->get('doctrine')->getEntityManager();
$parent = $em->getRepository('CommonMenuBundle:menu')->find($item->getParent());
$menu[$parent->getTitle()]
->setChildrenAttribute('class', 'dropdown-menu dropdown-menu-large row')
->setAttribute("class", "dropdown dropdown-large")
->addChild($item->getTitle(), array('uri' => $item->getRoute()))
->setAttribute("class", "col-sm-6")
;
} else {
$menu->addChild($item->getTitle(), array('uri' => $item->getRoute()));
}
}
return $menu;
}
В результате получилось вложенное меню:

А на фронтенде в моем случае отображается так:

За статью однозначно спасибо. Побольше бы про Симфони…
Sign up to leave a comment.
KnpMenuBundle + Sonata. Делаем меню из базы