wyyl/beike/Admin/View/Components/Sidebar.php

421 lines
13 KiB
PHP

<?php
namespace Beike\Admin\View\Components;
use Beike\Models\AdminUser;
use Beike\Plugin\Plugin;
use Illuminate\View\Component;
class Sidebar extends Component
{
public array $links = [];
public ?array $currentLink;
private string $adminName;
private ?string $routeNameWithPrefix;
private ?string $currentRouteName;
private ?string $currentPrefix;
private ?AdminUser $adminUser;
/**
* Create a new component instance.
*
* @return void
*/
public function __construct()
{
$this->adminName = admin_name();
$this->adminUser = current_user();
$this->routeNameWithPrefix = request()->route()->getName();
$this->currentRouteName = str_replace($this->adminName . '.', '', $this->routeNameWithPrefix);
$routeData = explode('.', $this->currentRouteName);
$this->currentPrefix = $routeData[0] ?? '';
}
/**
* Get the view / contents that represent the component.
*
* @return mixed
*/
public function render()
{
$this->links = $this->getMenus();
$this->handleMenus();
$this->currentLink = $this->getCurrentLink();
return view('admin::components.sidebar');
}
/**
* 返回所有菜单
* 小图标地址 https://icons.getbootstrap.com/
*
* @return mixed
*/
private function getMenus(): mixed
{
$menus = [
[
'route' => 'home.index',
'title' => trans('admin/common.home'),
'icon' => 'bi bi-house',
'prefixes' => $this->getHomeSubPrefix(),
],
[
'route' => 'orders.index',
'title' => trans('admin/common.order'),
'icon' => 'bi bi-clipboard-check',
'prefixes' => $this->getOrderSubPrefix(),
'children' => $this->getOrderSubRoutes(),
],
[
'route' => 'products.index',
'title' => trans('admin/common.product'),
'icon' => 'bi bi-box-seam',
'prefixes' => $this->getProductSubPrefix(),
'children' => $this->getProductSubRoutes(),
],
[
'route' => 'customers.index',
'title' => trans('admin/common.customer'),
'icon' => 'bi bi-person-circle',
'prefixes' => $this->getCustomerSubPrefix(),
'children' => $this->getCustomerSubRoutes(),
],
[
'route' => 'pages.index',
'title' => trans('admin/common.page'),
'icon' => 'bi bi-file-earmark-text',
'prefixes' => $this->getPageSubPrefix(),
'children' => $this->getPageSubRoutes(),
],
[
'route' => 'theme.index',
'title' => trans('admin/common.design'),
'icon' => 'bi bi-palette',
'prefixes' => $this->getDesignSubPrefix(),
'children' => $this->getDesignSubRoutes(),
],
[
'route' => 'plugins.index',
'title' => trans('admin/common.plugin'),
'icon' => 'bi bi-shop',
'prefixes' => $this->getPluginSubPrefix(),
'children' => $this->getPluginSubRoutes(),
],
[
'route' => 'settings.index',
'title' => trans('admin/common.setting'),
'icon' => 'bi bi-gear',
'prefixes' => $this->getSettingSubPrefix(),
'children' => $this->getSettingSubRoutes(),
],
];
return hook_filter('admin.components.sidebar.menus', $menus);
}
/**
* 获取二级菜单
*
* @return array|null
*/
private function getCurrentLink(): array|null
{
foreach ($this->links as $link) {
$prefixes = $link['prefixes'] ?? [];
if ($prefixes && in_array($this->currentPrefix, $prefixes)) {
return $link;
}
}
return null;
}
/**
* 处理是否选中等数据
*/
private function handleMenus()
{
foreach ($this->links as $index => $link) {
$prefixes = $link['prefixes'] ?? [];
if ($prefixes && in_array($this->currentPrefix, $prefixes)) {
$this->links[$index]['active'] = true;
} else {
$this->links[$index]['active'] = false;
}
$url = $link['url'] ?? '';
if (empty($url)) {
$this->links[$index]['url'] = admin_route($link['route']);
}
$title = $link['title'] ?? '';
if (empty($title)) {
$permissionRoute = str_replace('.', '_', $this->currentRouteName);
$this->links[$index]['title'] = trans("admin/common.{$permissionRoute}");
}
if (! isset($link['blank'])) {
$this->links[$index]['blank'] = false;
}
$icon = $link['icon'] ?? '';
if (empty($icon)) {
$this->links[$index]['icon'] = 'bi bi-link-45deg';
}
$children = $link['children'] ?? [];
if ($children) {
foreach ($children as $key => $item) {
$childPrefixes = $item['prefixes'] ?? [];
$excludes = $item['excludes'] ?? [];
if ($prefixes && in_array($this->currentPrefix, $childPrefixes)
&& (! $excludes || ! in_array($this->currentRouteName, $excludes))) {
$this->links[$index]['children'][$key]['active'] = true;
} else {
$this->links[$index]['children'][$key]['active'] = false;
}
$url = $item['url'] ?? '';
if (empty($url)) {
$this->links[$index]['children'][$key]['url'] = admin_route($item['route']);
}
$title = $item['title'] ?? '';
if (empty($title)) {
$permissionRoute = str_replace('.', '_', $item['route']);
$this->links[$index]['children'][$key]['title'] = trans("admin/common.{$permissionRoute}");
}
if (! isset($item['blank'])) {
$this->links[$index]['children'][$key]['blank'] = false;
}
}
}
}
}
/**
* 获取后台首页子页面路由前缀列表
*/
private function getHomeSubPrefix()
{
$prefix = ['home'];
return hook_filter('admin.sidebar.home.prefix', $prefix);
}
/**
* 获取后台产品子页面路由前缀列表
*/
private function getProductSubPrefix()
{
$prefix = ['products', 'multi_filter', 'categories', 'brands', 'attribute_groups', 'attributes'];
return hook_filter('admin.sidebar.product.prefix', $prefix);
}
/**
* 获取后台客户子页面路由前缀列表
*/
private function getCustomerSubPrefix()
{
$prefix = ['customers', 'customer_groups'];
return hook_filter('admin.sidebar.customer.prefix', $prefix);
}
/**
* 获取后台订单子页面路由前缀列表
*/
private function getOrderSubPrefix()
{
$prefix = ['orders', 'rmas', 'rma_reasons'];
return hook_filter('admin.sidebar.order.prefix', $prefix);
}
/**
* 获取后台内容子页面路由前缀列表
*/
private function getPageSubPrefix()
{
$prefix = ['pages', 'page_categories'];
return hook_filter('admin.sidebar.page.prefix', $prefix);
}
/**
* 获取后台设计子页面路由前缀列表
*/
private function getDesignSubPrefix()
{
$prefix = ['theme', 'design_menu'];
return hook_filter('admin.sidebar.design.prefix', $prefix);
}
/**
* 获取后台设计子页面路由前缀列表
*/
private function getPluginSubPrefix()
{
$prefix = ['plugins', 'marketing'];
return hook_filter('admin.sidebar.plugin.prefix', $prefix);
}
/**
* 获取后台系统设置子页面路由前缀列表
*/
private function getSettingSubPrefix()
{
$prefix = [
'settings', 'admin_users', 'admin_roles', 'tax_classes', 'tax_rates',
'regions', 'currencies', 'languages', 'countries', 'zones', 'account',
];
return hook_filter('admin.sidebar.setting.prefix', $prefix);
}
/**
* 获取首页子页面路由
*/
public function getHomeSubRoutes()
{
$routes = [];
return hook_filter('admin.sidebar.home_routes', $routes);
}
/**
* 获取商品子页面路由
*/
public function getProductSubRoutes()
{
$routes = [
['route' => 'products.index', 'prefixes' => ['products'], 'excludes' => ['products.trashed']],
['route' => 'categories.index', 'prefixes' => ['categories']],
['route' => 'brands.index', 'prefixes' => ['brands']],
['route' => 'attribute_groups.index', 'prefixes' => ['attribute_groups']],
['route' => 'attributes.index', 'prefixes' => ['attributes']],
['route' => 'multi_filter.index', 'prefixes' => ['multi_filter']],
['route' => 'products.trashed', 'prefixes' => ['products'], 'excludes' => ['products.index', 'products.edit']],
];
return hook_filter('admin.sidebar.product_routes', $routes);
}
/**
* 获取商品子页面路由
*/
public function getCustomerSubRoutes()
{
$routes = [
['route' => 'customers.index', 'prefixes' => ['customers'], 'excludes' => ['customers.trashed']],
['route' => 'customer_groups.index', 'prefixes' => ['customer_groups']],
['route' => 'customers.trashed', 'prefixes' => ['customers'], 'excludes' => ['customers.index', 'customers.edit']],
];
return hook_filter('admin.sidebar.customer_routes', $routes);
}
/**
* 获取订单子页面路由
*/
public function getOrderSubRoutes()
{
$routes = [
['route' => 'orders.index', 'prefixes' => ['orders']],
['route' => 'rmas.index', 'prefixes' => ['rmas']],
['route' => 'rma_reasons.index', 'prefixes' => ['rma_reasons']],
];
return hook_filter('admin.sidebar.order_routes', $routes);
}
/**
* 获取文章管理子页面路由
* @return mixed
*/
public function getPageSubRoutes()
{
$routes = [
['route' => 'pages.index', 'prefixes' => ['pages']],
['route' => 'page_categories.index', 'prefixes' => ['page_categories']],
];
return hook_filter('admin.sidebar.pages_routes', $routes);
}
/**
* 获取设计子页面路由
* @return mixed
*/
public function getDesignSubRoutes()
{
$routes = [
['route' => 'theme.index', 'prefixes' => ['theme'], 'hide_mobile' => true],
['route' => 'design_menu.index', 'prefixes' => ['design_menu'], 'hide_mobile' => 1],
['route' => 'design.index', 'prefixes' => ['design'], 'blank' => true, 'hide_mobile' => true],
['route' => 'design_footer.index', 'prefixes' => ['design_footer'], 'blank' => true, 'hide_mobile' => true],
];
return hook_filter('admin.sidebar.design_routes', $routes);
}
/**
* 获取插件子页面路由
* @return mixed
*/
public function getPluginSubRoutes()
{
$types = collect(Plugin::TYPES);
$types = $types->map(function ($item) {
return 'plugins.' . $item;
});
$routes[] = ['route' => 'plugins.index', 'prefixes' => ['plugins'], 'excludes' => $types->toArray()];
$originTypes = $types->push('plugins.index', 'plugins.edit')->push();
foreach (Plugin::TYPES as $type) {
$types = $originTypes->reject("plugins.{$type}");
$routes[] = ['route' => "plugins.{$type}", 'prefixes' => ['plugins'], 'title' => trans("admin/plugin.{$type}"), 'excludes' => $types->toArray()];
}
$routes[] = ['route' => 'marketing.index', 'prefixes' => ['marketing']];
return hook_filter('admin.sidebar.plugins_routes', $routes);
}
/**
* 获取系统设置子页面路由
* @return mixed
*/
public function getSettingSubRoutes()
{
$routes = [
['route' => 'settings.index', 'prefixes' => ['settings']],
['route' => 'account.index', 'prefixes' => ['account']],
['route' => 'admin_users.index', 'prefixes' => ['admin_users', 'admin_roles']],
['route' => 'regions.index', 'prefixes' => ['regions']],
['route' => 'tax_rates.index', 'prefixes' => ['tax_rates']],
['route' => 'tax_classes.index', 'prefixes' => ['tax_classes']],
['route' => 'currencies.index', 'prefixes' => ['currencies']],
['route' => 'languages.index', 'prefixes' => ['languages']],
['route' => 'countries.index', 'prefixes' => ['countries']],
['route' => 'zones.index', 'prefixes' => ['zones']],
];
return hook_filter('admin.sidebar.setting_routes', $routes);
}
}