partitech/sonata-menu-bundle

该扩展包通过 Sonata Admin Bundle 提供菜单管理(兼容 Sonata Page Bundle)。

安装: 50

依赖者: 1

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 0

公开问题: 0

类型:symfony-bundle

dev-main 2023-12-18 08:52 UTC

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