sagsoz06/laravel-menus

Laravel 菜单管理

0.3.2 2017-09-10 22:39 UTC

This package is auto-updated.

Last update: 2024-09-14 10:10:28 UTC


README

Latest Version on Packagist Software License Build Status Scrutinizer Coverage SensioLabsInsight Quality Score Total Downloads

Laravel Menus

nwidart/laravel-menus 是一个用于管理菜单的 Laravel 扩展包。它具有一个名为 presenters 的功能,该功能可以轻松地进行菜单渲染的样式定制和自定义结构。

此包是已重新发布、重新组织和维护的版本 pingpong/menus,该版本已不再维护。此包被用于 AsgardCMS

一个原始包没有的大优点: 测试

安装

您可以通过 composer 命令行安装它。

composer require nwidart/laravel-menus

安装包后,将新服务提供者添加到 config/app.php 文件中的 providers 数组中。

'providers' => [
	Nwidart\Menus\MenusServiceProvider::class,
],

在同一文件中,将新的 Menu 门面别名添加到 aliases 数组中。

'aliases' => array(
	'Menu' => Nwidart\Menus\Facades\Menu::class,
)

然后,通过运行以下命令发布包的资产

php artisan vendor:publish --provider="Nwidart\Menus\MenusServiceProvider"

创建菜单

您可以在 app/Support/menus.php 文件中定义您的菜单。该文件将由该包自动加载。

要创建菜单,只需从 Menu 门面调用 create 方法。第一个参数是菜单名称,第二个参数是用于定义菜单项的回调函数。

Menu::create('navbar', function($menu) {
    // define your menu items here
});

菜单项

如前所述,我们可以在回调函数中通过访问 $menu 变量来定义菜单项,该变量是 Nwidart\Menus\MenuBuilder 类的实例。

要定义一个普通 URL,可以使用 ->url() 方法。

Menu::create('navbar', function($menu) {
    // URL, Title, Attributes
    $menu->url('home', 'Home', ['target' => 'blank']);
});

如果您有命名路由,您可以通过调用 ->route() 方法来定义菜单项。

Menu::create('navbar', function($menu) {
	$menu->route(
        'users.show', // route name
        'View Profile', // title
        ['id' => 1], // route parameters
        ['target' => 'blank'] // attributes
    );
});

您也可以通过调用 ->add() 方法通过数组定义菜单项。

Menu::create('navbar', function($menu) {
    $menu->add([
        'url' => 'about',
        'title' => 'About',
        'attributes' => [
            'target' => '_blank'
        ]
    ]);

    $menu->add([
        'route' => ['profile', ['user' => 'nwidart']],
        'title' => 'Visit My Profile',
        'attributes' => [
            'target' => '_blank'
        ]
    ]);
});

菜单下拉

要创建下拉菜单,您可以调用 ->dropdown() 方法并将第一个参数传递为下拉菜单的标题,第二个参数传递为闭包回调,该回调检索 $sub 变量。变量 $subNwidart\Menus\MenuItem 类的实例。

Menu::create('navbar', function($menu) {
    $menu->url('/', 'Home');
    $menu->dropdown('Settings', function ($sub) {
        $sub->url('settings/account', 'Account');
        $sub->url('settings/password', 'Password');
        $sub->url('settings/design', 'Design');
    });
});

菜单多级下拉

您还可以通过使用 ->dropdown() 方法在下拉菜单内创建下拉菜单。这将允许您创建多级菜单项。

Menu::create('navbar', function($menu) {
    $menu->url('/', 'Home');
    $menu->dropdown('Account', function ($sub) {
        $sub->url('profile', 'Visit My Profile');
        $sub->dropdown('Settings', function ($sub) {
            $sub->url('settings/account', 'Account');
            $sub->url('settings/password', 'Password');
            $sub->url('settings/design', 'Design');
        });
        $sub->url('logout', 'Logout');
    });
});

菜单分隔符

您还可以为每个菜单项定义分隔符。您可以使用 ->divider() 方法在菜单项之间进行分隔。

Menu::create('navbar', function($menu) {
    $menu->url('/', 'Home');
    $menu->divider();
    $menu->url('profile', 'Profile')
});

下拉菜单标题

您还可以通过使用 ->header() 方法为指定的菜单项添加下拉菜单标题。

Menu::create('navbar', function($menu) {
    $menu->url('/', 'Home')
    $menu->dropdown('Settings', function ($sub) {
        $sub->header('ACCOUNT');
        $sub->url('/settings/design', 'Design');
        $sub->divider();
        $sub->url('logout', 'Logout');
    });
});

菜单项排序

您可以通过指定 order 参数来对菜单进行排序。

Menu::create('navbar', function($menu) {
    $menu->url('/', 'Home', 1);
    $menu->route('/', 'About', ['user' => '1'], 2);
    $menu->dropdown('Settings', function ($sub) {
        $sub->header('ACCOUNT');
        $sub->url('/settings/design', 'Design');
        $sub->divider();
        $sub->url('logout', 'Logout');
    }, 3);
});

您还可以通过调用 ->order 方法来设置排序值。

Menu::create('navbar', function($menu) {
    $menu->url('/', 'Home', ['icon' => 'fa fa-dashboard'])->order(1);
    $menu->route('/', 'About', ['user' => '1'], ['icon' => 'fa fa-user'])->order(2);
    $menu->dropdown('Settings', function ($sub) {
        $sub->header('ACCOUNT');
        $sub->url('/settings/design', 'Design');
        $sub->divider();
        $sub->url('logout', 'Logout');
    })->order(3);
});

默认情况下,排序功能是禁用的。您可以在配置文件中启用 ordering 功能。只需将 ordering 配置值更新为 true,现在您的菜单将按 order 键排序。

return [
	'ordering' => true
];

您还可以通过调用 ->enableOrdering->disableOrdering 方法为每个菜单启用或禁用排序。

Menu::create('navbar', function($menu) {
    // disable menu ordering
    $menu->enableOrdering();

    // disable menu ordering
    $menu->disableOrdering();
});

创建多个菜单

您还可以创建具有不同名称和菜单项的一组菜单。

Menu::create('menu1', function($menu) {
	$menu->route('home', 'Home');
    $menu->url('profile', 'Profile');
});

Menu::create('menu2', function($menu) {
    $menu->route('home', 'Home');
    $menu->url('profile', 'Profile');
});

菜单展示器

本包包含一些用于将菜单转换为HTML的展示类。默认生成的菜单样式为bootstrap navbar。但,还有几种不同的菜单样式。

您可以通过->style()方法应用菜单样式。

Menu::create('navbar', function($menu) {
    $menu->style('nav-pills');
});

或者您可以通过->setPresenter()方法设置哪个展示类来呈现菜单样式。

Menu::create('navbar', function($menu) {
    $menu->setPresenter(\Nwidart\Menus\Presenters\Bootstrap\NavTabPresenter::class);
});

在渲染菜单时,您也可以设置展示类的样式。

Menu::render('navbar', 'navbar-right');

Menu::render('navbar', \Nwidart\Menus\Presenters\Bootstrap\NavPillsPresenter::class);

可用菜单展示类列表

创建自定义展示类

您可以创建自己的展示类。确保您的展示类扩展了Nwidart\Menus\Presenters\Presenter并实现了'Nwidart\Menus\Presenters\PresenterInterface'接口。

例如,这是zurb-top-bar展示类。

use Nwidart\Menus\Presenters\Presenter;

class ZurbTopBarPresenter extends Presenter
{
	/**
	 * {@inheritdoc }
	 */
	public function getOpenTagWrapper()
	{
		return  PHP_EOL . '<section class="top-bar-section">' . PHP_EOL;
	}

	/**
	 * {@inheritdoc }
	 */
	public function getCloseTagWrapper()
	{
		return  PHP_EOL . '</section>' . PHP_EOL;
	}

	/**
	 * {@inheritdoc }
	 */
	public function getMenuWithoutDropdownWrapper($item)
	{
		return '<li'.$this->getActiveState($item).'><a href="'. $item->getUrl() .'">'.$item->getIcon().' '.$item->title.'</a></li>';
	}

	/**
	 * {@inheritdoc }
	 */
	public function getActiveState($item)
	{
		return \Request::is($item->getRequest()) ? ' class="active"' : null;
	}

	/**
	 * {@inheritdoc }
	 */
	public function getDividerWrapper()
	{
		return '<li class="divider"></li>';
	}

	/**
	 * {@inheritdoc }
	 */
	public function getMenuWithDropDownWrapper($item)
	{
		return '<li class="has-dropdown">
		        <a href="#">
		         '.$item->getIcon().' '.$item->title.'
		        </a>
		        <ul class="dropdown">
		          '.$this->getChildMenuItems($item).'
		        </ul>
		      </li>' . PHP_EOL;
		;
	}
}

要使用这个自定义展示类,您可以使用setPresenter方法。

Menu::create('zurb-top-bar', function($menu) {
    $menu->setPresenter('ZurbTopBarPresenter');
});

注册新的菜单样式

菜单样式就像是一个展示类的别名。您可以在配置文件config/menus.php中注册您的样式。

return [
	'navbar'		=>	'Nwidart\Menus\Presenters\Bootstrap\NavbarPresenter',
	'navbar-right'	=>	'Nwidart\Menus\Presenters\Bootstrap\NavbarRightPresenter',
	'nav-pills'		=>	'Nwidart\Menus\Presenters\Bootstrap\NavPillsPresenter',
	'nav-tab'		=>	'Nwidart\Menus\Presenters\Bootstrap\NavTabPresenter',

	'zurb-top-bar'	=>	'ZurbTopBarPresenter',
];

现在,您可以使用这样的样式。

Menu::create('zurb-top-bar', function($menu) {
    $menu->style('zurb-top-bar');
});

视图展示器

如果您不想使用展示类,您可以使用视图展示类。我们可以通过调用->setView()方法设置哪个视图来展示菜单。

Menu::create('navbar', function($menu) {
    $menu->setView('menus::default');
});

可用视图展示类列表

渲染菜单

要渲染菜单,您可以使用renderget方法。

Menu::render('navbar');

Menu::get('navbar');

您也可以在第二个参数中设置展示菜单的样式。

Menu::render('navbar', 'navbar-right');

或者您也可以设置展示菜单的视图。

Menu::render('navbar', 'menus::nav-tabs');

菜单实例

有时,我们可能需要在控制器或其他位置添加一个新菜单。要获取现有菜单的实例,您可以使用instance方法。

$menu = Menu::instance('zurb-top-bar');

// You can also make additions to the menu again

$menu->add(['title' => 'Settings', 'route' => 'settings']);

$menu->url('profile', 'Profile');

$menu->route('settings', 'Settings');

查找菜单项

要查找菜单项,您可以使用来自Nwidart\Menus\MenuBuilder类的findBy方法。

$menu = Menu::instance('sidebar');

$menu->url('profile', 'Profile');

$menuItem = $menu->findBy('title', 'Profile');

// add child menu
$menuItem->url('foo', 'Foo');

您也可以使用whereTitle辅助方法来查找特定的菜单项。此外,您还可以在whereTitle方法的第二个参数中定位的回调函数中添加其他子菜单项。

$menu = Menu::instance('sidebar');

$menu->url('profile', 'Profile');

$menu->whereTitle('Profile', function ($sub)
{
	$sub->url('foo', 'Foo');
});

// add childs menu

修改菜单

在创建菜单后,我们可能需要添加其他附加菜单。您可以通过->modify方法修改菜单。

Menu::modify('navbar', function($menu)
{
	$menu->add([
		'title' => 'Foo',
		'url' => 'bar',
	]);
});