laravel-admin利用ModelTree实现对分类信息的管理

根据laravel的基本操作步骤依次完成如下操作:
主要是参考laravel-admin内置的Menu菜单管理的功能,利用ModelTree实现业务中的Tree数据管理。

1. 创建模型
    php artisan make:model Models/Category
2. 创建迁移文件
    php artisan make:migration create_categories_table
3. 创建填充文件
    php artisan make:seeder CategoriesSeeder
4. 创建后端控制器
    php artisan admin:make CategoryController --model=AppModelsCategory
5. 创建后端路由
    app/admin/routes.php : $router->resource('/web/categories',CategoryController::class);
6. 添加后端菜单
    /web/categories:菜单路径
7. 其他定义及编辑定制

定义Model文件Category.php

namespace AppModels;

use EncoreAdminTraitsAdminBuilder;
use EncoreAdminTraitsModelTree;
use IlluminateDatabaseEloquentModel;

class Category extends Model
{
    use ModelTree, AdminBuilder;
    //
    protected $fillable = ['name','description','order','parent_id'];

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);

        $this->setParentColumn('parent_id');
        $this->setOrderColumn('order');
        $this->setTitleColumn('name');
    }
}

定义迁移

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('description')->nullable();
            $table->integer('order')->unsigned();
            $table->integer('parent_id')->unsigned()->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

填充文件

class CategoriesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
        DB::table('categories')->delete();
        for($i = 0; $i < 3; $i++ ){
            DB::table('categories')->insert(
                [
                    'name' => 'CAT'.$i,
                    'description' => 'desc_'.$i,
                    'order' => $i,
                    'parent_id' => null
                ]
            );
        }

    }
}

定义控制器

<?php

namespace AppAdminControllers;

use AppModelsCategory;

use EncoreAdminForm;
use EncoreAdminFacadesAdmin;
use EncoreAdminLayoutColumn;
use EncoreAdminLayoutContent;
use AppHttpControllersController;
use EncoreAdminControllersModelForm;
use EncoreAdminLayoutRow;
use EncoreAdminTree;
use EncoreAdminWidgetsBox;
use IlluminateSupportFacadesDB;

class CategoryController extends Controller
{
    use ModelForm;

    protected $header = '类型管理';

    /**
     * Index interface.
     *
     * @return Content
     */
    public function index()
    {
        return Admin::content(function (Content $content) {

            $content->header($this->header);
            $content->description('类型列表');

            $content->row(function (Row $row) {

                $row->column(6, $this->treeView()->render());

                $row->column(6, function (Column $column) {
                    $form = new EncoreAdminWidgetsForm();
                    $form->action(admin_base_path('/web/categories'));


                    $form->text('name','类型名称');
                    $form->textarea('description','类型描述信息');
                    $form->number('order','排序序号');
                    $form->select('parent_id','父类名称')->options(Category::selectOptions());
                    
                    $form->hidden('_token')->default(csrf_token());

                    $column->append((new Box(trans('admin.new'), $form))->style('success'));
                });
            });



        });
    }


    protected function treeView()
    {
        return Category::tree(function (Tree $tree) {
            $tree->disableCreate();
            return $tree;
        });
    }
    

    /**
     * Edit interface.
     *
     * @param $id
     * @return Content
     */
    public function edit($id)
    {
        return Admin::content(function (Content $content) use ($id) {

            $content->header($this->header);
            $content->description('编辑类型');

            $content->body($this->form()->edit($id));
        });
    }

    /**
     * Create interface.
     *
     * @return Content
     */
    public function create()
    {
        return Admin::content(function (Content $content) {

            $content->header($this->header);
            $content->description('添加类型');

            $content->body($this->form());
        });
    }


    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        return Admin::form(Category::class, function (Form $form) {

            $form->display('id', 'ID');

            $form->text('name','类型名称');
            $form->textarea('description','类型描述信息');
            $form->number('order','排序序号');
            $form->select('parent_id','父类名称')->options(Category::selectOptions());


        });
    }


    public function getCategoryOptions()
    {
        return DB::table('categories')->select('id','name as text')->get();
    }
}

添加路由

$router->resource('/web/categories',CategoryController::class);

添加后台菜单

具体操作略
图片描述

原文地址:https://www.cnblogs.com/jasonLiu2018/p/11926687.html