1 Introduction
, (*1)
This widget is to display a multi level menu. There can be nested sub-menus. Used for Laravel framework., (*2)
The widget uses data from the database, in which there are, in addition to the primary keys, also the parent keys., (*3)
Data from the database is taken from a model and must be instance of Illuminate\Database\Eloquent\Collection., (*4)
, (*5)
2 Requirements
- laravel 5.5+ | 6+ | 7+ | 8+ | 9+ | 10+ | 11+ | 12+
- php >= 7.1.0
- composer
3 Installation
3.1 General from remote repository
Via composer:, (*6)
composer require itstructure/laravel-multi-menu "~2.0.9"
, (*7)
3.2 If you are testing this package from local server directory
In application composer.json
file set the repository, like in example:, (*8)
"repositories": [
{
"type": "path",
"url": "../laravel-multi-menu",
"options": {
"symlink": true
}
}
],
Here,, (*9)
../laravel-multi-menu - directory name, which has the same directory level as application and contains multi menu package., (*10)
Then run command:, (*11)
composer require itstructure/laravel-multi-menu:dev-master --prefer-source
, (*12)
3.3 Publish in application
-
To publish all parts run command:, (*13)
php artisan multimenu:publish
, (*14)
-
To publish only config run command:, (*15)
php artisan multimenu:publish --only=config
, (*16)
It stores multimenu.php
config file to config
folder., (*17)
-
To publish only views run command:, (*18)
php artisan multimenu:publish --only=views
, (*19)
It stores view files to resources/views/vendor/multimenu
folder., (*20)
-
Else you can use --force
argument to rewrite already published files., (*21)
Or another variant:, (*22)
php artisan vendor:publish --provider="Itstructure\MultiMenu\MultiMenuServiceProvider"
, (*23)
4 Usage
4.1 Simple variant
Config part
return [
'primaryKeyName' => 'id', // Editable
'parentKeyName' => 'parent_id', // Editable
'mainTemplate' => 'main', // Editable
'itemTemplate' => 'item', // Editable
];
View template part
@php
$multiOptions = [ // Editable
'config' => config('multimenu'),
'data' => $pages
];
@endphp
@multiMenu($multiOptions)
Here, $pages
- is from controller part, for example $pages = Page::all();
. Must be instance of Illuminate\Database\Eloquent\Collection
., (*24)
4.2 Addition config options and data
Config part
There is an example to set item blade templates for 3 levels:, (*25)
return [
'primaryKeyName' => 'id',
'parentKeyName' => 'parent_id',
'mainTemplate' => 'main',
'itemTemplate' => [
'levels' => [
'item',
'item',
'item_new',
]
],
];
You can set mainTemplate
by analogy., (*26)
Blade templates
Example of a custom changed blade template file item.blade
:, (*27)
<li>
<a href="{{ $data->icon }}">
Initial item Id {{ $data->id }} {{ isset($addition) ? ' | ' . $addition : '' }}
</a>
</li>
Example of a custom changed blade template file item_new.blade
:, (*28)
<li>
<a href="{{ $data->icon }}" style="color: green; font-weight: bold;">
New item Id {{ $data->id }} {{ isset($addition) ? ' | ' . $addition : '' }}
</a>
</li>
Addition data
Example in a template file:, (*29)
@php
$multiOptions = [
'config' => config('multimenu'),
'data' => $pages,
'additionData' => [
'levels' => [
0 => [],
1 => ['addition' => 'addition string']
]
]
];
@endphp
@multiMenu($multiOptions)
4.3 Database table structure example
Table "catalogs"
, (*30)
| 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 Prevention of collisions
5.1 Before save model
To prevent the entry of the wrong parent identifier (for example, the new number that is a child in a subordinate chain of nested records):, (*31)
Use static method checkNewParentId(Model $mainModel, int $newParentId... e.t.c)
, (*32)
Here are the required parameters:, (*33)
$mainModel - current model record, in which the parent id will be changed for new value., (*34)
$newParentId - new parent id, which must be verified., (*35)
5.2 After delete model
To prevent breaks in the chain of subject submissions:, (*36)
Use static method afterDeleteMainModel(Model $mainModel... e.t.c)
, (*37)
Here is the required parameter:, (*38)
$mainModel - deleted model record., (*39)
This function will rebuild the chain., (*40)
License
Copyright © 2018-2025 Andrey Girnik girnikandrey@gmail.com., (*41)
Licensed under the MIT license. See LICENSE.txt for details., (*42)