Pull to refresh

Comments 6

Чем мне не нравится Symfony (Хотя она мне, конечно, нравися), так это тем, что для, вроде бы, простых действий вроде меню, нужно писать столько кода. Сейчас пишу на Silex, все в разы быстрее получается.
Понимаете, тут даже не в кол-ве кода дело. Мне кажется, что используя такой код (его правда не много, просто в статье так кажется) мы действительно получаем очень гибкую систему. Возможно мои писательские способности меня тут подвели и статья должна была быть гораздо мень чем есть, тем не менее я постарался как можно более подробно рассмотреть вопрос, оставив без внимания некие моменты.
Ну я писал на симфони, там хватает лишних телодвижений, хотя в плане готовых модулей она лучше, но от этого и менее гибкая, вообще, конечно, от задачи зависит, где-то будет лучше, где-то хуже.
Поигрался с меню, сделал пару телодвижений, а именно:

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.

Articles