itstructure/laravel-multi-menu

Laravel 框架的多级菜单渲染小部件

2.0.8 2024-03-31 13:52 UTC

This package is auto-updated.

Last update: 2024-08-31 00:29:39 UTC


README

1 简介

Latest Stable Version Latest Unstable Version License Total Downloads Build Status Scrutinizer Code Quality

此小部件用于显示多级菜单。可以有嵌套的子菜单。用于 Laravel 框架。

该小部件使用来自 数据库 的数据,其中除了主键外,还有父键。

来自 数据库 的数据是从一个模型中获取的,并且必须是 Illuminate\Database\Eloquent\Collection 的实例。

Multi level menu example scheme

2 要求

  • laravel 5.5+ | 6+ | 7+ | 8+ | 9+ | 10+ | 11+
  • php >= 7.1.0
  • composer

3 安装

3.1 从远程仓库的通用安装

通过 composer

composer require itstructure/laravel-multi-menu "~2.0.8"

3.2 如果您正在从本地服务器目录测试此包

在应用 composer.json 文件中设置仓库,例如

"repositories": [
    {
        "type": "path",
        "url": "../laravel-multi-menu",
        "options": {
            "symlink": true
        }
    }
],

这里,

../laravel-multi-menu - 目录名,与应用程序处于相同目录级别,并包含多菜单包。

然后运行命令

composer require itstructure/laravel-multi-menu:dev-master --prefer-source

3.3 在应用程序中发布

  • 要发布所有部分,运行命令

    php artisan multimenu:publish

  • 要仅发布配置,运行命令

    php artisan multimenu:publish --only=config

    它将 multimenu.php 配置文件存储到 config 文件夹。

  • 要仅发布视图,运行命令

    php artisan multimenu:publish --only=views

    它将视图文件存储到 resources/views/vendor/multimenu 文件夹。

  • 否则,您可以使用 --force 参数重写已发布的文件。

或另一种变体

php artisan vendor:publish --provider="Itstructure\MultiMenu\MultiMenuServiceProvider"

4 使用方法

4.1 简单版本

配置部分

return [
    'primaryKeyName' => 'id', // Editable
    'parentKeyName' => 'parent_id', // Editable
    'mainTemplate' => 'main', // Editable
    'itemTemplate' => 'item', // Editable
];

视图模板部分

@php
$multiOptions = [ // Editable
    'config' => config('multimenu'),
    'data' => $pages
];
@endphp
@multiMenu($multiOptions)

这里,$pages - 来自控制器部分,例如 $pages = Page::all();。必须是 Illuminate\Database\Eloquent\Collection 的实例。

4.2 额外的配置选项和数据

配置部分

有一个设置3级项blade模板的示例

return [
    'primaryKeyName' => 'id',
    'parentKeyName' => 'parent_id',
    'mainTemplate' => 'main',
    'itemTemplate' => [
        'levels' => [
            'item',
            'item',
            'item_new',
        ]
    ],
];

您可以通过类比设置 mainTemplate

Blade模板

自定义更改的blade模板文件示例 item.blade

<li>
    <a href="{{ $data->icon }}">
        Initial item Id {{ $data->id }} {{ isset($addition) ? ' | ' . $addition : '' }}
    </a>
</li>

自定义更改的blade模板文件示例 item_new.blade

<li>
    <a href="{{ $data->icon }}" style="color: green; font-weight: bold;">
        New item Id {{ $data->id }} {{ isset($addition) ? ' | ' . $addition : '' }}
    </a>
</li>

附加数据

模板文件中的示例

@php
$multiOptions = [
    'config' => config('multimenu'),
    'data' => $pages,
    'additionData' => [
        'levels' => [
            0 => [],
            1 => ['addition' => 'addition string']
        ]
    ]
];
@endphp
@multiMenu($multiOptions)

4.3 数据库表结构示例

表 "catalogs"

| id  | parent_id |   title    | ... |
|-----|-----------|------------|-----|
|  1  |   NULL    |   item 1   | ... |
|  2  |   NULL    |   item 2   | ... |
|  3  |   NULL    |   item 3   | ... |
|  4  |   NULL    |   item 4   | ... |
|  5  |   NULL    |   item 5   | ... |
|  6  |     2     |  item 2.1  | ... |
|  7  |     2     |  item 2.2  | ... |
|  8  |     7     | item 2.2.1 | ... |
|  9  |     7     | item 2.2.2 | ... |
|  10 |     7     | item 2.2.3 | ... |
| ... |    ...    |     ...    | ... |

5 防止冲突

5.1 在保存模型之前

防止错误父标识符的输入(例如,新的数字是嵌套记录从属链中的子项)

使用静态方法 checkNewParentId(Model $mainModel, int $newParentId... e.t.c)

以下是需要参数

$mainModel - 当前模型记录,其中父id将被更改为新值。

$newParentId - 需要验证的新父id。

5.2 在删除模型之后

防止主题提交链的断裂

使用静态方法 afterDeleteMainModel(Model $mainModel... e.t.c)

以下是所需参数

$mainModel - 被删除的模型记录。

此函数将重建链。

许可证

版权 © 2018-2024 Andrey Girnik girnikandrey@gmail.com

根据 MIT 许可证 许可。有关详细信息,请参阅 LICENSE.txt。