nethead / menu
使用PHP生成HTML菜单的包
Requires
- php: ^7.3
- nethead/markup: ^2.0
Requires (Dev)
- phpunit/phpunit: ^9
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\ActivatorInterface
和Nethead\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
接口。
让我们来看看所有可用的项类型
- 分隔符 - 此类型根本不交互,它仅作为装饰。
- SimpleItem - 可以显示文本、图片,甚至是您想要显示的任何内容,但它不具有交互性。它可以作为多级菜单的父项目,或者充当副标题。如何使用它取决于您。
- 锚点 - 这是一种特殊的项目类型,用于指示链接是内部链接(不会离开您的网站),但它是一个指向当前查看页面内部位置的锚点。它使用URL片段(文本后跟#字符)。
- 外部 - 允许您将用户引导到您的网站之外的其他位置的项目类型。
- 内部 - 允许您将用户引导到您网站内部其他位置的项目类型。
- 特殊 - 表示除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许可证分发。如果您觉得合适,请随意使用它。