nethead/menu

使用PHP生成HTML菜单的包

v2.2 2023-04-25 18:20 UTC

This package is auto-updated.

Last update: 2024-09-25 21:12:16 UTC


README

v2.0

此包能够使用面向对象的PHP API构建HTML菜单。该包与Packagist和Composer一起分发。

安装

首先,使用Composer安装包。

composer require nethead/menu

如果您已经在由Composer管理的依赖项的项目中工作,则无需执行其他操作。如果不是这样,请包含Composer的autoload文件

include 'vendor/autoload.php';

使用该包

使用MenuFactory创建菜单

创建新的Menu对象最快的方法是使用MenuFactory类。

use Nethead\Menu\Factories\MenusFactory;

MenusFactory::make('main-menu');

没错 - 您无需将其分配给任何变量,MenuFactory会自动将创建的菜单对象存储在Repository中。请查看下面的Repository章节以了解更多信息。

手动创建菜单

如果出于某种原因,您正在使用Menu类的构造函数,您可以在以后将新创建的菜单添加到repository中,这样它们在其他作用域中也将可用。在手动创建菜单时,您必须另外提供此菜单的激活器和渲染器。

激活器是一个对象,它能够测试菜单项并检查当前请求URL是否与项的URL匹配。如果匹配,激活器将该项标记为活动项,以便您可以在CSS中相应地进行样式化。有一个激活器可供您使用,您可以在Nethead\Menu\Activators\BasicUrlActivator中找到它。

渲染器是一个对象,它能够根据菜单项对象提供的信息渲染HTML。有一个渲染器可供您使用,您可以在Nethead\Menu\Renderers\MarkupRenderer中找到它。此渲染器使用Nethead\Markup包,这是一种渲染和处理HTML的简单方法(也是面向对象的)。

手动创建菜单需要您为菜单对象提供这些依赖项。如果您需要其他方式来渲染或激活项,请随时编写自己的渲染器和激活器。只需确保您的类实现了Nethead\Menu\Contracts\ActivatorInterfaceNethead\Menu\Contracts\RendererInterface,因为这是Menu期望的。

现在,让我们手动创建一个菜单。MenuFactory负责在我们的Repository中注册我们的菜单,因此如果我们希望此菜单在其他作用域中可用,我们需要使用set方法将其注册。

use Nethead\Menu\Activators\BasicUrlActivator;
use Nethead\Menu\Renderers\MarkupRenderer;
use Nethead\Menu\Repository;
use Nethead\Menu\Menu;

$menu = new Menu('sidebar', new BasicUrlActivator(), new MarkupRenderer());

Repository::set($menu);

从Repository检索菜单

要检索创建的菜单以进行进一步操作,请使用Repository。

use Nethead\Menu\Repository;

// one created with MenusFactory
$mainMenu    = Repository::get('main-menu');
// one created manually and registered
$sidebarMenu = Repository::get('sidebar');   

如果您创建了一个Repository类实例,它也支持数组访问语法。或者如果您更喜欢,有一个render()方法用于快速输出菜单(如果菜单不存在于Repository中,它将输出空字符串)。

$repository = new Nethead\Menu\Repository();

print $repository['main-menu'];

print $repository->render('sidebar'); // less error prone

管理项

好吧,到目前为止,该菜单没有分配任何项,所以它相当无用。让我们将一个链接添加到主页的菜单中。您可以在菜单中添加6种类型的项,并且您可以自由地创建自己的实现,只要它们扩展了Nethead\Menu\Items\Item。如果您希望它们在某些URL上设置为活动项,您还应实现Nethead\Menu\Contracts\ActivableItem接口。

让我们来看看所有可用的项类型

  1. 分隔符 - 此类型根本不交互,它仅作为装饰。
  2. SimpleItem - 可以显示文本、图片,甚至是您想要显示的任何内容,但它不具有交互性。它可以作为多级菜单的父项目,或者充当副标题。如何使用它取决于您。
  3. 锚点 - 这是一种特殊的项目类型,用于指示链接是内部链接(不会离开您的网站),但它是一个指向当前查看页面内部位置的锚点。它使用URL片段(文本后跟#字符)。
  4. 外部 - 允许您将用户引导到您的网站之外的其他位置的项目类型。
  5. 内部 - 允许您将用户引导到您网站内部其他位置的项目类型。
  6. 特殊 - 表示除http://之外方案的链接的特殊项目。

要将项目添加到菜单中,创建其实例并将其分配。

use Nethead\Menu\Activators\BasicUrlActivator;
use Nethead\Menu\Renderers\MarkupRenderer;
use Nethead\Menu\Items\Internal;
use Nethead\Menu\Menu;

$menu = new Menu('sidebar', new BasicUrlActivator(), new MarkupRenderer());
$item = new Internal(['The text for the link'], '/one/of/your/pages', $menu);
$menu->setItem($item);

使用此代码,我们创建了一个带有标准激活器和渲染器的菜单。接下来,我们将创建具有所需href属性的项目。然后,我们将它分配给侧边栏菜单。当菜单在模板中输出时,将在菜单内渲染该项目。然而,如果您想快速构建菜单,这种方法并不十分高效。当您需要通过某些处理函数传递菜单对象,以便模块或插件添加自己的链接时,它更有用。因此,现在让我们看一下ItemsFactory类及其功能。

ItemsFactory实例是传递给Menu::createItems的第一个参数,也是传递给MenusFactory::make的第二个参数。让我们使用MenusFactory创建一个包含几个简单链接的菜单。

use Nethead\Menu\Factories\MenusFactory;
use Nethead\Menu\Factories\ItemsFactory;

MenusFactory::make('main-menu', function(ItemsFactory $factory) {
    $factory->internal(['Homepage'], '/');
    $factory->external(['Example domain'], 'http://example.com');
    
    $factory->simple(['Table of contents'])->group(function(ItemsFactory $factory) {
        $factory->anchor(['Chapter 1'], 'chapter-1');
        $factory->anchor(['Chapter 2'], 'chapter-2');
        $factory->anchor(['Chapter 3'], 'chapter-3');
    });
    
    $factory->simple(['Contact'])->group(function(ItemsFactory $factory) {
        $factory->special(['Mail me'], 'mailto', 'example@example.com');
        $factory->separator();
        $factory->special(['Call me'], 'tel', '555555555');
    });
});

就这样!无需担心在任一菜单上调用setItem。ItemsFactory将负责注册所有创建的项目及其在主菜单中的结构。

参考

有关API的更多信息,请参阅docs目录。

致谢

此软件包由Kamil Gałkiewicz开发,并在此以MIT许可证分发。如果您觉得合适,请随意使用它。