Chuyển tới nội dung chính
Phiên bản: 8.0.0

Menu

Thêm vị trí menu

Để thêm vị trí hiển thị menu bạn sử dung method addLocation, addLocation nhận vào 2 tham số

ParamsTypeDescriptionMặc định
$locationsstringid vị trí
$labelstringtên vị trí
ThemeMenu::addLocation($locations, $label)

Hiển thị menu theo vị trí

ThemeMenu::render(array $args): voidecho thẳng HTML ra output, không trả về chuỗi.

ThemeMenu::render(['theme_location' => $locations]);

Ba cách chỉ định nguồn menu (xét theo thứ tự ưu tiên):

KeyÝ nghĩa
theme_locationVị trí đã đăng ký bằng addLocation()
theme_idId của menu (có cache theo cms.cache_time.default)
theme_dataTruyền thẳng mảng dữ liệu menu đã dựng sẵn
KeyMặc địnhÝ nghĩa
walkerwalker_nav_menuTên class walker dựng HTML

[!NOTE] Nếu class walker truyền vào không tồn tại, hệ thống âm thầm quay về walker_nav_menu (alias của Theme\Supports\WalkerNavMenu). Vì vậy gõ sai tên walker sẽ không báo lỗi — menu vẫn hiện nhưng bằng HTML mặc định.

Lấy data menu theo vị trí

$locations có thể là vị trí bạn đăng ký bằng ThemeMenu::addLocation hoặc id menu

ThemeMenu::getData($locations)

Data nhận được có dạng

[
0 => [
"id" => 44, //id menu item
"name" => "Giới thiệu",
"slug" => "gioi-thieu",
"type" => "page",
"object_type" => "page",
"menu_id" => "1", //id menu
"parent_id" => 0,
"object_id" => 1,
"child" => [],
"data" => [] //Data mở rộng
],
1 => [
"id" => 58,
"name" => "Sản Phẩm",
"slug" => "san-pham",
"type" => "products_categories",
"object_type" => "products_categories",
"menu_id" => "1",
"parent_id" => 0,
"object_id" => 1,
"child" => [
0 => [
"id" => 58,
"name" => "Bếp chiên điện",
"slug" => "bep-chien-dien",
...
]
],
"data" => []
],
]

Thêm options vào menu item

Để thêm option vào menu item bạn sử dung method addItemOption, addItemOption nhận vào 2 tham số

ParamsTypeDescriptionMặc định
$modulestringloại menu item
$argsarraycác cấu hình

Các loại $module hỗ trợ:

$moduleÁp dụng choKhoá lọc thêm trong $args
menu (mặc định)Mọi menu item
pageMenu item là trang tĩnh
postMenu item là bài viếtpost_type (mặc định all)
post_categoriesMenu item là danh mụccate_type (mặc định all)
khácLoại menu do plugin tự đăng kýxử lý qua filter theme_menu_add_item_{module}_option

$args chứa thông tin field input cần thêm. Bắt buộc có field hoặc name (dùng làm khoá) — thiếu cả hai thì hàm trả về false và không làm gì.

ThemeMenu::addItemOption('menu', [
'field' => 'icon',
'label' => 'Icon',
'type' => 'font-icon',
'level' => 0
]);

// Chỉ áp cho menu item thuộc post type "post"
ThemeMenu::addItemOption('post', [
'field' => 'badge',
'label' => 'Nhãn',
'type' => 'text',
'post_type' => 'post',
]);

Key level quy định option xuất hiện ở cấp menu nào.

Đọc lại option đã lưu bằng ThemeMenu::getItemOption($object, $object_type).

Thêm Menu Type

Bạn sử dụng filter admin_menu_list_object để thêm một loại menu mới. Ví dụ thật từ plugin sicommerce — thêm loại menu thương hiệu:

use Ecommerce\Models\Brands;

function adminMenuBrands($menuData)
{
$menuData['brands'] = [
'label' => trans('sicommerce::brand.title'),
'type' => 'brands',
'data' => []
];

$data = Brands::all();

if(hasItems($data))
{
foreach ($data as $datum)
{
if(empty($datum->id)) continue;

$menuData['brands']['data'][$datum->id] = (object)[
'id' => $datum->id,
'name' => $datum->name
];
}
}

return $menuData;
}

add_filter('admin_menu_list_object', 'adminMenuBrands');

Mỗi phần tử cần ba khoá: label (tên nhóm trong màn hình quản lý menu), type (dùng làm object_type của menu item), data (mảng id => object{id, name}).

Model của SkillDo dùng all() để lấy danh sách. Không có Brands::gets() — và Brands::get() gọi tĩnh chỉ trả về một bản ghi (xem Eloquent Model).