darkling/nette-menu

Nette 框架的菜单

3.0 2019-01-22 19:19 UTC

This package is auto-updated.

Last update: 2024-09-23 08:00:53 UTC


README

Build Status Donate

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

    • 修复了多个菜单的注册 #23
    • 添加了处理数据的快捷方式 #24
  • 2.0.0

    • 重构 - 完全重写
  • 1.1.1

    • 迁移至 Carrooi 组织下
  • 1.1.0

  • 1.0.4

    • 添加了 hasIconhasCounter 方法
    • 支持“绝对”目标 #6
  • 1.0.3

    • 添加了用于处理项目数据的快捷方法 #5
  • 1.0.2

    • 支持在包含选项中“动态”模块 #4
  • 1.0.1

    • 包含选项可以是目标数组 #1
    • 添加了对可翻译标题的支持 #2
  • 1.0.0

    • 第一个版本