海南旅游SAAS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.8 KiB

  1. <?php
  2. namespace App\Admin\Controllers;
  3. use App\Models\Category;
  4. use App\Models\Product;
  5. use Dcat\Admin\Admin;
  6. use Dcat\Admin\Form;
  7. use Dcat\Admin\Grid;
  8. use Dcat\Admin\Layout\Content;
  9. use Dcat\Admin\Layout\Row;
  10. use Dcat\Admin\Show;
  11. use Dcat\Admin\Http\Controllers\AdminController;
  12. use Dcat\Admin\Tree;
  13. class CategoryController extends AdminController
  14. {
  15. public function index(Content $content)
  16. {
  17. return $content->header('产品分类')
  18. ->body(function (Row $row) {
  19. $tree = new Tree(new Category);
  20. $tree->expand();
  21. $tree->query(function ($model) {
  22. //agent_id为0是系统分类,其它是代理商分类
  23. return $model->where('agent_id', 0);
  24. });
  25. $row->column(12, $tree);
  26. });
  27. }
  28. /**
  29. * Make a grid builder.
  30. *
  31. * @return Grid
  32. */
  33. protected function grid()
  34. {
  35. return Grid::make(new Category(), function (Grid $grid) {
  36. $grid->column('id')->sortable();
  37. $grid->column('pid');
  38. $grid->column('name');
  39. $grid->column('sort');
  40. });
  41. }
  42. /**
  43. * Make a show builder.
  44. *
  45. * @param mixed $id
  46. *
  47. * @return Show
  48. */
  49. protected function detail($id)
  50. {
  51. return Show::make($id, new Category(), function (Show $show) {
  52. $show->field('id');
  53. $show->field('pid');
  54. $show->field('name');
  55. $show->field('sort');
  56. });
  57. }
  58. /**
  59. * Make a form builder.
  60. *
  61. * @return Form
  62. */
  63. protected function form()
  64. {
  65. return Form::make(new Category(), function (Form $form) {
  66. $options = Category::selectOptions(fn($query) => $query->where('agent_id', 0));
  67. $form->display('id');
  68. $form->select('pid')->options($options)->required();
  69. $form->text('name')->required();
  70. $form->text('sort')->default(255)->help('越小越靠前');
  71. })->saving(function (Form $form) {
  72. //不允许编辑的字段
  73. $form->ignore(['id', 'deleted_at']);
  74. //后台管理员的agent_id为0
  75. $form->agent_id = 0;
  76. $form->sort = $form->sort ?? 255;
  77. })->deleting(function (Form $form) {
  78. //获取到要删除分类的ID
  79. $category_id = (int)$form->getKey();
  80. //获取要删除类目的所有下级ID
  81. $category = Category::where('agent_id', 0)->pluck('pid', 'id')->toArray();
  82. $ids = getChildCate($category_id, $category);
  83. if (Product::query()->whereIn('category_id', $ids)->exists()) {
  84. return $form->response()->error('该分类下已经发布产品,不允许删除');
  85. }
  86. return $form->response()->error('不允许删除');
  87. });
  88. }
  89. }
  90. //获取$pid下的所有子类目
  91. function getChildCate($pid, $category): array
  92. {
  93. $cate_arr = [$pid];
  94. foreach ($category as $k => $v) {
  95. if ($v == $pid) {
  96. $cate_arr = array_merge($cate_arr, getChildCate($k, $category));
  97. }
  98. }
  99. return $cate_arr;
  100. }