Files
dafuweng/addons/webman/controller/MenuController.php
2026-03-02 13:44:38 +08:00

127 lines
4.9 KiB
PHP

<?php
namespace addons\webman\controller;
use addons\webman\Admin;
use addons\webman\model\AdminDepartment;
use ExAdmin\ui\component\common\Html;
use ExAdmin\ui\component\common\Icon;
use ExAdmin\ui\component\form\Form;
use ExAdmin\ui\component\grid\card\Card;
use ExAdmin\ui\component\grid\grid\Grid;
use ExAdmin\ui\component\grid\tabs\Tabs;
use ExAdmin\ui\support\Arr;
/**
* 菜单管理
*/
class MenuController
{
protected $model;
public function __construct()
{
$this->model = plugin()->webman->config('database.menu_model');
}
/**
* 系统菜单
* @auth true
* @return Card
*/
public function index(): Card
{
return Card::create(Tabs::create()
->destroyInactiveTabPane()
->pane(admin_trans('menu.type.' . AdminDepartment::TYPE_DEPARTMENT), $this->menuList())
->pane(admin_trans('menu.type.' . AdminDepartment::TYPE_CHANNEL), $this->menuList(AdminDepartment::TYPE_CHANNEL))
->type('card')
);
}
/**
* 系统菜单
* @param int $type 菜单类型
* @return Grid
*/
public function menuList(int $type = AdminDepartment::TYPE_DEPARTMENT):Grid
{
return Grid::create(new $this->model(),function (Grid $grid) use($type){
$grid->title(admin_trans('menu.title'));
$grid->model()->where('type', $type)->orderBy('sort');
$grid->autoHeight();
$grid->tree();
$grid->column('name', admin_trans('menu.fields.name'))->display(function ($value, $data) {
return Html::create([
Icon::create($data['icon']),
' ',
$value
]);
});
$grid->column('url', admin_trans('menu.fields.url'))->display(function ($value) {
if (empty($value) || $value == '#') {
return $value;
}
return Html::create($value)->tag('a')->redirect($value);
});
$grid->column('status', admin_trans('menu.fields.status'))->switch();
$grid->column('open', admin_trans('menu.fields.open'))->switch();
$grid->sortInput();
$grid->quickSearch();
$grid->setForm()->modal($this->form());
$grid->updated(function (){
return message_success(admin_trans('grid.update_success'))->refreshMenu();
});
$grid->deleted(function (){
return message_success(admin_trans('grid.update_success'))->refreshMenu();
});
});
}
/**
* 系统菜单
* @auth true
* @param int $pid
* @return Form
*/
public function form(int $pid = 0): Form
{
return Form::create(new $this->model,function (Form $form) use($pid){
$form->title(admin_trans('menu.title'));
$form->text('name', admin_trans('menu.fields.name'))->required();
$form->radio('type', admin_trans('menu.fields.type'))
->default(AdminDepartment::TYPE_DEPARTMENT)
->disabled($form->isEdit())
->options([
AdminDepartment::TYPE_DEPARTMENT => admin_trans('menu.type.' . AdminDepartment::TYPE_DEPARTMENT),
AdminDepartment::TYPE_CHANNEL => admin_trans('menu.type.' . AdminDepartment::TYPE_CHANNEL)
])->when('==', AdminDepartment::TYPE_DEPARTMENT, function (Form $form) use($pid){
$menus = $this->model::where('type', AdminDepartment::TYPE_DEPARTMENT)->get()->toArray();
array_unshift($menus, ['id' => 0, 'name' => admin_trans('menu.fields.top'), 'pid' => -1]);
$form->treeSelect('pid', admin_trans('menu.fields.pid'))
->default($pid)
->options($menus)
->required();
})->when('==', AdminDepartment::TYPE_CHANNEL, function (Form $form) use($pid){
$menus = $this->model::where('type', AdminDepartment::TYPE_CHANNEL)->get()->toArray();
array_unshift($menus, ['id' => 0, 'name' => admin_trans('menu.fields.top'), 'pid' => -1]);
$form->treeSelect('pid', admin_trans('menu.fields.pid'))
->default($pid)
->options($menus)
->required();
});
$form->autoComplete('url', admin_trans('menu.fields.url'))
->groupOptions(Arr::tree(Admin::node()->all()),'children','title','url');
$form->icon('icon', admin_trans('menu.fields.icon'))
->default('far fa-circle')
->required();
$form->number('sort', admin_trans('menu.fields.sort'))
->default($this->model::where('pid', $pid)->max('sort') + 1);
$form->saved(function(){
return message_success(admin_trans('form.save_success'))->refreshMenu();
});
});
}
}