Comments 6
Сейчас затестим
0
Чем мне не нравится Symfony (Хотя она мне, конечно, нравися), так это тем, что для, вроде бы, простых действий вроде меню, нужно писать столько кода. Сейчас пишу на Silex, все в разы быстрее получается.
0
Понимаете, тут даже не в кол-ве кода дело. Мне кажется, что используя такой код (его правда не много, просто в статье так кажется) мы действительно получаем очень гибкую систему. Возможно мои писательские способности меня тут подвели и статья должна была быть гораздо мень чем есть, тем не менее я постарался как можно более подробно рассмотреть вопрос, оставив без внимания некие моменты.
0
Поигрался с меню, сделал пару телодвижений, а именно:
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;
}
В результате получилось вложенное меню:
А на фронтенде в моем случае отображается так:
0
За статью однозначно спасибо. Побольше бы про Симфони…
0
Sign up to leave a comment.
KnpMenuBundle + Sonata. Делаем меню из базы