tatter/菜单

CodeIgniter 4 的动态菜单

v1.0.2 2022-04-27 01:48 UTC

README

CodeIgniter 4 的动态菜单

Coverage Status

快速入门

  1. 使用 Composer 安装: > composer require tatter/menus
  2. 通过扩展 Tatter\Menus\Menu 创建您的菜单
  3. 将您的菜单别名添加到 Config\Menus
  4. MenuFilter 应用到所有需要菜单的路由

功能

菜单 提供跨您应用程序的动态菜单。 菜单 组织并注入菜单内容,让您可以专注于构建。

安装

通过 Composer 轻松安装,以利用 CodeIgniter 4 的自动加载功能,并始终保持最新状态

  • > composer require tatter/menus

或者,通过下载源代码并将目录添加到 app/Config/Autoload.php 手动安装。

配置(可选)

可以通过扩展其配置文件来更改库的默认行为。将 examples/Menus.php 复制到 app/Config/ 并遵循注释中的说明。如果 app/Config 中没有找到配置文件,则库将使用自己的配置。

使用

构建

菜单 基于 Spatie\Menu 构建,具有所有其奇妙、动态和流畅的功能。使用他们的文档来制作您想要的简单或复杂的菜单

通过扩展 Tatter\Menus\Menu 创建您的菜单。您会在源代码中注意到 Menu 需要您提供一个方法:public function __toString(): string;。您可以使用提供的 $builder 属性来访问底层的 Spatie\Menu 来构建您的菜单,或者提供您自己的 HTML 代码或 view() 返回值。以下是一些示例

class MainMenu extends \Tatter\Menus\Menu
{
	public function __toString(): string
	{
		return $this->builder
			->link(site_url('/'), 'Home')
			->link(site_url('/about'), 'About')
			->html('<hr>')
			->link(site_url('/contact'), 'Contact')
			->render();
	}
}

class FruitMenu extends \Tatter\Menus\Menu
{
	public function __toString(): string
	{
		return view('menus/fruit', ['active' => 'banana']);
	}
}

注意:$builder 是初始化为“设置为当前 URL”。您可以再次调用 setActive() 来删除或更改活动菜单项。由于 Spatie\Menu 在相对和绝对 URL 混合中的限制,如果您想使用此默认“活动”URL,则必须向 Menu 提供完整的 URL 值(例如,使用 site_url())。

部署

由于 MenuStringable,因此可以直接在您的视图或布局文件中使用它。但是,菜单 还附带了一个 控制器过滤器,您可以使用它将菜单内容直接注入到响应中。首先,您需要为要使用的每个 Menu 类创建一个别名。创建 app/Config/Menus.php(或从 examples 文件夹开始复制)并将您的菜单类添加到 $aliases 数组中。例如

class Menus extends \Tatter\Menus\Config\Menus
{
	/**
	 * Menu class aliases.
	 *
	 * @var array<string, string>
	 */
	public $aliases = [
		'main'  => \App\Menus\MainMenu::class,
		'fruit' => \ShopModule\FruitMenu::class,
	];
}

一旦设置好别名,您就可以将它们作为参数传递给任何路由的 MenuFilter

$routes->add('shop/(:any)', 'ShopModule\ShopController::show/$1', ['filter' => 'menus:fruit']);

然后在您的视图或布局中放置一个双大括号中的占位符令牌,其中包含别名目标名称

<html>
	<body>
		{{main}}
		<h1>Fruit Shop</h1>
		{{fruit}}
...

注意,有时最好使用 app/Config/Filters.php 批量应用过滤器。遗憾的是,Config\Filters 中尚不支持参数,但您可以创建自己的特定于参数的过滤器来解决此问题

<?php namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Tatter\Menus\Filters\MenusFilter;

class MainMenuFilter extends MenusFilter
{
	public function after(RequestInterface $request, ResponseInterface $response, $arguments = null): ?ResponseInterface
	{
		return parent::after($request, $response, ['main', 'fruit']);
	}
}

打包菜单

菜单 包含一些预制的菜单,可以立即使用或在此基础上构建以创建自己的变体。所有菜单都位于 Tatter\Menus\Menus 命名空间中,并扩展了 Menu 类,因此可以与过滤器一起使用或作为您创建的任何其他菜单使用。

面包屑

BreadcrumbsMenu 是一个特殊的菜单,使用水平风格的导航链接来处理嵌套内容。这个菜单已经为 Bootstrap 预先设置了样式,默认使用框架的 IncomingRequest::$uri 获取的段,但您可以使用静态方法 setgetpushpop 提供自己的设置。此外,BreadcrumbsMenu::discover() 将尝试创建一个默认菜单。所有这些方法都使用 Breadcrumb 类,这是一个对 URL 和显示值的简单包装。例如

use Tatter\Menus\Breadcrumb;
use Tatter\Menus\Menus\BreadcrumbsMenu;

class Users extends Controller
{
	public function show(int $userId)
	{
		// Get the User
		$user = model('UserModel')->find($userId);

		// Start with the default breadcrumbs
		BreadcrumbsMenu::discover();

		// Pop off the numeric last segment
		BreadcrumbsMenu::pop();

		// Replace it with the user's name
		BreadcrumbsMenu::push(new Breadcrumb(current_url(), $user->name));

		return view('users/show', ['user' => $user]);
	}
}

... 如果您已设置过滤器,其余的将由系统为您处理。