onkbear/backpack-nested-crud

2.0.2 2020-09-20 21:48 UTC

This package is auto-updated.

Last update: 2024-11-21 07:01:35 UTC


README

Latest Stable Version Software License

This package gives nested CRUD operations on your edit page.

Inspired by Nested resources in Backpack CRUD

E.g.

Gives the avility of CRUD operations of comment model as a field on user edit page.

For Laravel-Backpack/CRUD v4.0, please use ^1.1.

Demo

Install

composer require onkbear/backpack-nested-crud

Usage

There are four (instead of create, read, update, delete) nested CRUD operations.

    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedListOperation;
    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedCreateOperation;
    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedUpdateOperation;
    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedDeleteOperation;

Example

Please create User model and Comment model with relationship.

Please create UserCrudController.

class UserCrudController extends CrudController
{
    use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
    use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;

    public function setup()
    {
        CRUD::setModel('App\Models\User');
        CRUD::setRoute(config('backpack.base.route_prefix').'/user');
        CRUD::setEntityNameStrings('user', 'users');
    }

    protected function setupListOperation()
    {
        CRUD::addColumns(['name']);
    }

    protected function setupCreateOperation()
    {
        CRUD::addField([
            'name'  => 'name',
            'label' => 'Name',
            'type'  => 'text',
            'tab'   => 'Texts',
        ]);
    }

    protected function setupUpdateOperation()
    {
        $this->setupCreateOperation();

        CRUD::addField([
            'name'      => 'comments',
            'label'     => 'Comment',
            'type'      => 'nested_crud',
            'target'    => 'comment',
            'model'     => 'App\Models\Comment',
            'tab'       => 'Comments',  // optional
        ]);
    }
}

Create the CRUD controller

use App\Http\Requests\CommentRequest as StoreRequest;
use App\Http\Requests\CommentRequest as UpdateRequest;

class UserCommentCrudController extends CrudController
{
    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedListOperation;
    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedCreateOperation;
    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedUpdateOperation;
    use \Onkbear\NestedCrud\app\Http\Controllers\Operations\NestedDeleteOperation;

    public function setup()
    {
        // set the Eloquent object
        CRUD::setModel(\App\Models\Comment::class);

        // get the user_id parameter
        $userId = \Route::current()->parameter('user_id');

        // set a different route for the admin panel buttons
        CRUD::setRoute(config('backpack.base.route_prefix').'/user/'.$userId.'/comment');

        // show only specific user's comments
        CRUD::addClause('where', 'user_id', $userId);

        // ...
    }

    protected function setupNestedListOperation()
    {
        // ...
    }

    protected function setupNestedCreateOperation()
    {
        CRUD::setValidation(StoreRequest::class);

        // get the user_id parameter
        $userId = \Route::current()->parameter('user_id');

        // add a foreign key field as a hidden field (may need only for create operation)
        CRUD::addField([
            'name' => 'user_id',
            'type' => 'hidden',
            'value' => $userId
        ]);

        // ...
    }

    protected function setupNestedUpdateOperation()
    {
        CRUD::setValidation(UpdateRequest::class);

        // ...
    }

Add the route

Setup the route in route/custom.php

    Route::crud('user/', 'UserCrudController');
    Route::group(['prefix' => 'user/{user_id}'], function() {
        Route::crud('comment', 'UserCommentCrudController');
    });

You have following routes.

  • admin/user/
  • admin/user/{user_id}/comment/

That's it.

You can also use backpack operations into UserCommentCrudController or extend CommentCrudController if it is exist.

Customize views for list view

There are two templates for list view.

  • nested_crud::nested_list : table view (default)
  • nested_crud::nested_grid_list : grid view

Grid View

If you would like to use grid view, simply use the set method below.

// UserCommentCrudController.php

    protected function setupNestedListOperation()
    {
        $this->crud->setListView('nested_crud::nested_grid_list');
    }

If you created view files with exact same name in resources/views/vendor/backpack/nested_crud folder, it will override.