darkling / nette-menu
Nette 框架的菜单
Requires
- php: >=7.1
- nette/application: ^3.0
- nette/di: ^3.0
- nette/http: ^3.0
- nette/utils: ^3.0
Requires (Dev)
- mockery/mockery: dev-master
- nette/tester: ^2.1
README
Nette 菜单
Nette 组件,用于创建菜单、面包屑和网站地图。
要求
- PHP >=7.1
- Nette ^2.4
安装
使用 composer 安装包
$ composer require carrooi/nette-menu
注册为 Nette 扩展
extensions: menu: Carrooi\Menu\DI\MenuExtension menu:
基本用法
您可以以关联的多维数组的形式编写菜单链接。正因为如此,您能够创建所需的任何菜单和子菜单结构。
menu: front: items: Home: action: Front:Home: Books: link: '#' items: All: action: Front:Books:all Featured: action: Front:Books:featured admin: items: Users: action: Admin:Users: Books: action: Admin:Books:
<?php namespace App; use Carrooi\Menu\UI\IMenuComponentFactory; use Carrooi\Menu\UI\MenuComponent; use Nette\Application\UI\Presenter; final class BasePresenter extends Presenter { private $menuFactory; public function injectBasePresenter(IMenuComponentFactory $menuFactory) { $this->menuFactory = $menuFactory; } protected function createComponentMenu(): MenuComponent { return $this->menuFactory->create('front'); } }
{control menu} <!-- display menu --> {control menu:breadcrumbs} <!-- display breadcrumbs --> {control menu:sitemap} <!-- display sitemap -->
在 neon 配置中的此结构将生成两个菜单
front
- 首页 (操作:
Front:Home:
) - 书籍 (链接:
#
)- 全部 (操作:
Front:Books:all
) - 特色 (操作:
Front:Books:featured
)
- 全部 (操作:
admin
- 用户 (操作:
Admin:Users:
) - 书籍 (操作:
Admin:Books:
)
模板
此包包括 3 个默认模板 (菜单、面包屑、网站地图)。然而,在实际项目中,应仅使用默认的网站地图模板。其他两个模板仅应在开始构建适合您网站外观的自定义模板时帮助您。
您可以在菜单配置中更改模板
menu: front: templates: menu: %appDir%/path/to/custom/menu.latte breadcrumbs: %appDir%/path/to/custom/breadcrumbs.latte sitemap: %appDir%/path/to/custom/sitemap.latte
如您所见,每个菜单都可以有不同的模板。
项目可见性
在某些特定情况下隐藏一些链接可能很有用。为此,我们在项目上提供了 visibility
选项,您可以在其中指定链接应在哪个模板中可见。
menu: front: items: Home: action: Front:Home: visibility: menu: true breadcrumbs: false sitemap: true
通过正则表达式标记活动项
菜单项可以通过与整个 Presenter 名称和操作比较的正则表达式(或正则表达式数组)标记为活动项。您可以通过 include
设置设置您的正则表达式。
menu: front: items: Home: action: Front:Home: include: '^Front\:Home\:[a-zA-Z\:]+$' # mark as active for all actions of "Front:Home:" presenter Books: action: Front:Books: include: # mark as active for actions "Front:Books:default" and "Front:Books:edit" - '^Front\:Books\:default$' - '^Front\:Books\:edit$'
翻译
在模板中显示链接标题时,我们始终使用已翻译的标题。
您有三种翻译器选项
- 不执行任何操作:将使用原始
ReturnTranslator
类。此翻译器仅返回给定文本。 - 手动设置翻译器:提供您自己的
Nette\Localization\ITranslator
实现。 - 设置为
true
:菜单扩展将自动在 DI 容器中查找您的翻译器。
services: - App\MyOwnFrontTranslator menu: front: translator: @App\MyOwnFrontTranslator admin: translator: true
自定义数据
每个链接都可以包含附加数据,这些数据可以在以后用于例如您的自定义 latte 模板。
menu: admin: items: Adminer: link: https://:20000 data: icon: fa fa-database attrs: target: _blank
<a href="{$item->getRealLink()" n:attr="(expand) $link->getData('attrs')"> <i class="{$item->getData('icon')"></i> {$link->getRealTitle()} </a>
授权
有时您可能希望根据自定义规则隐藏一些链接,例如来自 nette 的授权。
此菜单包使用自定义 IAuthorizator
接口,您可以使用它来编写自己的授权器。
<?php namespace App; use Carrooi\Menu\IMenuItem; use Carrooi\Menu\Security\IAuthorizator; final class FrontAuthorizator implements IAuthorizator { public function isMenuItemAllowed(IMenuItem $item): bool { return isItemAllowed($item); } }
services: - App\FrontAuthorizator menu: front: authorizator: @App\FrontAuthorizator
链接生成器
当您要在模板中显示链接时,它使用 ILinkGenerator
接口从菜单配置中的数据生成链接。如果您想更改默认逻辑(使用 nette 的 link
方法),您只需实现您自己的自定义链接生成器。
<?php namespace App; use Carrooi\Menu\IMenuItem; use Carrooi\Menu\LinkGenerator\ILinkGenerator; final class FrontLinkGenerator implements ILinkGenerator { public function link(IMenuItem $item): string { return generateLink($item); } }
services: - App\FrontLinkGenerator menu: front: linkGenerator: @App\FrontLinkGenerator
您也可以稍后覆盖某些链接子树的链接生成器
menu: front: items: Home: action: Front:Home: Books: link: '#' linkGenerator: @App\BooksLinkGenerator
菜单加载器
如果您想从数据库而不是 neon 配置构建菜单,您可以通过创建 IMenuLoader
类来实现。
查看默认的 ArrayMenuLoader 了解其工作原理。
变更日志
-
2.1.0
-
2.0.0
- 重构 - 完全重写
-
1.1.1
- 迁移至 Carrooi 组织下
-
1.1.0
- 支持ACL权限(感谢 whipsterCZ)
- 支持生成站点地图(感谢 whipsterCZ)
-
1.0.4
- 添加了
hasIcon
和hasCounter
方法 - 支持“绝对”目标 #6
- 添加了
-
1.0.3
- 添加了用于处理项目数据的快捷方法 #5
-
1.0.2
- 支持在包含选项中“动态”模块 #4
-
1.0.1
-
1.0.0
- 第一个版本