namespace MyFolder\MenuBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="menu") * @ORM\Entity(repositoryClass="MyFolder\MenuBundle\Entity\MenuRepository") */ class Menu{ /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $title; /** * @ORM\Column(type="string", length=100) */ protected $route; /** * @ORM\Column(type="string", nullable=true) */ protected $alias; /** * @ORM\Column(type="boolean") */ protected $static; /** * @ORM\ManyToOne(targetEntity="MyFolder\MenuBundle\Entity\MenuType", inversedBy="menuTypeId") * @ORM\JoinColumn(name="menuTypeId", referencedColumnName="id") */ protected $menuTypeId; }
namespace MyFolder\MenuBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="menu_type") * @ORM\Entity(repositoryClass="MyFolder\MenuBundle\Entity\MenuTypeRepository") */ class MenuType { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $title; /** * @ORM\OneToMany(targetEntity="Menu", mappedBy="menuTypeId") */ private $typeId; }
/** * @ORM\ManyToOne(targetEntity="MyFolder\MenuBundle\Entity\MenuType", inversedBy="menuTypeId") * @ORM\JoinColumn(name="menuTypeId", referencedColumnName="id") */ protected $menuTypeId;
/** * @ORM\OneToMany(targetEntity="Menu", mappedBy="menuTypeId") */ private $typeId;
namespace MyFolder\MenuBundle\Admin; use Sonata\AdminBundle\Admin\Admin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Show\ShowMapper; class MenuAdmin extends Admin{ protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('title', null, array()) ->add('route', null, array()) ->add('alias', null, array()) ->add('static', null, array('required' => false)) ->add('menuTypeId', 'sonata_type_model', array( 'class'=>'MenuBundle:MenuType', 'property'=>'title', 'required' => false ) ) ; } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('title', null, array()) ->add('id', null, array()) ->add('route', null, array()) ; } public function configureShowField(ShowMapper $showMapper){ $showMapper ->add('title', null, array()) ->add('id', null, array()) ->add('route', null, array()) ; } protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('title', null, array()) ->add('route', null, array()) ->add('id', null, array()) ->add('menuTypeId', 'entity', array( 'class'=>'MenuBundle:MenuType', 'property'=>'title' ) ) ; } }
namespace MyFolder\MenuBundle\Admin; use Sonata\AdminBundle\Admin\Admin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Show\ShowMapper; class MenuTypeAdmin extends Admin{ protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('title', null, array()) ; } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('title', null, array()) ->add('id', null, array()) ; } public function configureShowField(ShowMapper $showMapper){ $showMapper ->add('title', null, array()) ->add('id', null, array()) ; } protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('title', null, array()) ->add('id', null, array()) ; } }
parameters: services: admin.menu: class: MyFolder\MenuBundle\Admin\MenuAdmin tags: - { name: sonata.admin, manager_type: orm, group: , label: } arguments: [null, MyFolder\MenuBundle\Entity\Menu, SonataAdminBundle:CRUD] admin.menu_type: class: MyFolder\MenuBundle\Admin\MenuTypeAdmin tags: - { name: sonata.admin, manager_type: orm, group: , label: } arguments: [null, MyFolder\MenuBundle\Entity\MenuType, SonataAdminBundle:CRUD]
$(document).ready(function () { $('input[id$="_static"]').click(function(){ var $_thisRoute = $('input[id$="_route"]'), defaultValues = $_thisRoute.val().split('/'); if($(this).is(':checked')) { $_thisRoute.val('/custom/'+defaultValues[defaultValues.length -1]); } else { $_thisRoute.val('/'+defaultValues[defaultValues.length -1]); } }) });
namespace MyFolder\MenuBundle\Menu; use Knp\Menu\FactoryInterface; use Knp\Menu\ItemInterface; use Symfony\Component\DependencyInjection\ContainerAware; class Builder extends ContainerAware { public function mainMenu(FactoryInterface $factory, array $options) { $menuItems = $this->container->get('menu')->getMainMenu(); $menu = $factory->createItem('root'); $this->setCurrentItem($menu); $menu->setChildrenAttribute('class', 'nav'); $menu->setExtra('currentElement', 'active'); foreach($menuItems as $item) { $menu->addChild($item->getTitle(), array('uri' => $item->getRoute())); } return $menu; } protected function setCurrentItem(ItemInterface $menu) { $menu->setCurrentUri($this->container->get('request')->getPathInfo()); } }
parameters: services: menu: class: MyFolder\MenuBundle\Service\MenuService arguments: [@service_container] admin.menu: class: MyFolder\MenuBundle\Admin\MenuAdmin tags: - { name: sonata.admin, manager_type: orm, group: , label: } arguments: [null, MyFolder\MenuBundle\Entity\Menu, SonataAdminBundle:CRUD] admin.menu_type: class: MyFolder\MenuBundle\Admin\MenuTypeAdmin tags: - { name: sonata.admin, manager_type: orm, group: , label: } arguments: [null, MyFolder\MenuBundle\Entity\MenuType, SonataAdminBundle:CRUD]
namespace MyFolder\MenuBundle\Service; use Symfony\Component\DependencyInjection\Container; class MenuService { private $doctrine; private $container; private $menuRepository; public function __construct(Container $container) { $this->container = $container; $this->doctrine = $this->container->get('doctrine'); $this->menuRepository = $this->doctrine->getRepository('MenuBundle:Menu'); } public function getMainMenu() { return $this->menuRepository->getMainMenu(); } }
namespace MyFolder\MenuBundle\Entity; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query\ResultSetMapping; class MenuRepository extends EntityRepository { public function getMainMenu() { return $this->findBy(array('menuTypeId' => 1)); } }
{{ knp_menu_render('MenuBundle:Builder:mainMenu', { 'currentClass': 'active'}) }}
/** * @Template() * @Route("/custom/{link}", name="_custom_page", defaults={"link" = "/"}) */ public function customAction($link) { return $this->render('CommonBundle:Default:commonPage.html.twig', array('page' => $link)); }
Source: https://habr.com/ru/post/202072/
All Articles