partitech / sonata-menu-bundle
该扩展包通过 Sonata Admin Bundle 提供菜单管理(兼容 Sonata Page Bundle)。
dev-main
2023-12-18 08:52 UTC
Requires
- php: >=8.2
- doctrine/doctrine-bundle: ^1.8 || ^2.0
- sonata-project/admin-bundle: ^4.16.0
- sonata-project/doctrine-orm-admin-bundle: ^4.4.0
- symfony/config: >=6.0
- symfony/framework-bundle: >=6.0
This package is auto-updated.
Last update: 2024-09-18 10:35:44 UTC
README
本扩展包通过 Sonata Admin Bundle 简化菜单管理,并兼容 Sonata Page Bundle。它是基于 GitHub 上的卓越 Sonata Menu Bundle 衍生而来。由于原始扩展包未更新,且我们的拉取请求仍待处理,我们主动进行了升级,继续向社区提供这项宝贵的资源。
兼容性
Symfony 6.3
先决条件
- SonataAdminBundle
- SonataPageBundle(可选)
安装
composer require partitech/sonata-menu-bundle
配置
// Symfony 6
// config/bundles.php
Partitech\SonataMenu\PartitechSonataMenuBundle::class => ['all' => true],
php bin/console cache:clear
php bin/console doctrine:migration:diff
php bin/console doctrine:migration:migrate
php bin/console assets:install
sonata_admin.yml
将菜单添加到您的 Sonata Admin 菜单列表中。对于 Symfony 6,您也可以让它为空,菜单将自动添加
sonata_admin:
dashboard:
groups:
// Optional for symfony 4
sonata.admin.group.menu_builder:
label: config.label_menu
label_catalogue: PartitechSonataMenuBundle
icon: '<i class="fa fa-magic"></i>'
items:
- sonata_menu.admin.menu
// Sonata page menu
# sonata.admin.group.cms:
# label: site
# label_catalogue: SonataPageBundle
# icon: '<i class="fa fa-puzzle-piece"></i>'
# items:
# - sonata.page.admin.site
# - sonata.page.admin.page
高级配置(Symfony 6)
创建自定义实体
编辑配置
- sonata_menu.yaml
sonata_menu:
entities:
menu: AppBundle\Entity\Menu
menu_item: AppBundle\Entity\MenuItem
然后创建相关的实体菜单和菜单项。您可以添加额外字段
- 菜单
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Partitech\SonataMenu\Model\Menu as BaseMenu;
#[ORM\Table(name: "sonata_extra__menu")]
#[ORM\Entity(repositoryClass: "Partitech\SonataMenu\Repository\MenuRepository")]
class Menu extends BaseMenu
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: "integer")]
private $id;
public function getId(): ?int
{
return $this->id;
}
}
- 菜单项
<?php
namespace App\Entity;
use App\Repository\MenuItemRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Partitech\SonataMenu\Model\MenuItem as BaseMenuItem;
#[ORM\Table(name: "sonata_extra__menu_item")]
#[ORM\Entity(repositoryClass: "Partitech\SonataMenu\Repository\MenuItemRepository")]
class MenuItem extends BaseMenuItem
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: "integer")]
private $id;
public function getId(): ?int
{
return $this->id;
}
}
清除缓存并更新数据库
php bin/console cache:clear
php bin/console doctrine:migration:diff
php bin/console doctrine:migration:migrate
通过扩展原始类来更新管理类
编辑配置
- sonata_menu.yaml
sonata_menu:
entities:
menu: App\Entity\Menu
menu_item: App\Entity\MenuItem
admins:
menu: App\Admin\MyMenuAdmin
menu_item: App\Admin\MyMenuItemAdmin
并创建您自己的管理类
namespace App\Admin;
use Partitech\SonataMenu\Admin\MenuAdmin as BaseAdmin;
use Sonata\AdminBundle\Form\FormMapper;
class MyMenuAdmin extends BaseAdmin
{
protected function configureFormFields(FormMapper $formMapper):void
{
parent::configureFormFields($formMapper);
}
}
namespace App\Admin;
use Partitech\SonataMenu\Admin\MenuItemAdmin as BaseAdmin;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class MyMenuItemAdmin extends BaseAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
parent::configureFormFields($formMapper);
$formMapper
->with('config.label_menu_item')
->add('icon', TextType::class, [
'label' => 'config.label_icon'
]
)
->end()
->end();
}
}
开始使用菜单管理器
控制器
$mm = $this->container->get('sonata_menu.manager');
$menuId = 1; // Example
$menu = $mm->load($menuId);
// $status = true (Get enabled menu items)
// $status = false (Get disabled menu items)
// getMenuItems($menu, $root = MenuManager::ITEM_CHILD, $status = MenuManager::STATUS_ALL)
$menuItems = $mm->getMenuItems($menu, true);
return $this->render('menu/menu.html.twig', [
'$menuItems' => $menuItems,
]);
然后,展示您的作品。对于前端,您可以按需输出结果。
例如
- menu.html.twig
{% if menuItems is not null and menuItems|length > 0 %}
{% import 'AppBundle:Menu:menu_tree_macro.html.twig' as tree %}
{% set currentPath = app.request.requestUri %}
{{ tree.menu(menuItems, currentPath) }}
{% endif %}
- menu_tree_macro.html.twig
{% macro menu(items, currentPath) %}
{% import _self as self %}
<ul>
{% for menuItem in items %}
{% set url = menuItem.url %}
{% set attributes = "menu-item" %}
{% if menuItem.classAttribute %}
{% set attributes = attributes ~ ' ' ~ menuItem.classAttribute %}
{% endif %}
{% if menuItem.hasChild() %}
{% set attributes = attributes ~ ' has-child' %}
{% for childItem in menuItem.children %}
{% set childUrl = childItem.url %}
{% if childUrl == currentPath %}
{% set attributes = attributes ~ ' current-parent' %}
{% endif %}
{% endfor %}
{% endif %}
<li class="{{ attributes }}" role="menu-item">
{% if menuItem.hasChild() %}
<a href="{{ url }}" class="parent" {% if currentPath == url %} class="current"{% endif %}" {% if menuItem.target %} target="_blank"{% endif %}>{{ menuItem.name }}</a>
{{ self.menu(menuItem.children, currentPath) }}
{% else %}
<a href="{{ url }}" {% if currentPath == url %} class="current"{% endif %}" {% if menuItem.target %} target="_blank"{% endif %}>{{ menuItem.name }}</a>
{% endif %}
</li>
{% endfor %}
</ul>
{% endmacro %}
变更日志
1.0.0
- 卓越菜单扩展包的升级
附加信息
初始版本(sf2,sf3,sf4)
作者:Nan GUO 公司: Prodigious
升级版本(sf6)
作者:Thomas Bourdin 公司: Partitech
作者:Géraud Bourdin 公司: Partitech