7

I would like to override the CRUD views of the Laravel Backpack CRUD package, because I want to make small changes to the layout. But obviously I don't want to change the CRUD package itself. Is there an elegant to do this?

Sybrand Hoeksma
  • 113
  • 1
  • 1
  • 3

4 Answers4

11

In your controller which is extending Backpack\CRUD\app\Http\Controllers\CrudController you need to override the method like index,create,edit which you want to change. All method are in-

Backpack\CRUD\app\Http\Controllers\CrudController

All the methods are here. You need to change here

 public function index()
{
    $this->crud->hasAccessOrFail('list');

    $this->data['crud'] = $this->crud;
    $this->data['title'] = ucfirst($this->crud->entity_name_plural);

    // get all entries if AJAX is not enabled
    if (! $this->data['crud']->ajaxTable()) {
        $this->data['entries'] = $this->data['crud']->getEntries();
    }

    // load the view from /resources/views/vendor/backpack/crud/ if it exists, otherwise load the one in the package
    // $this->crud->getListView() returns 'list' by default, or 'list_ajax' if ajax was enabled
    return view('your_view_name', $this->data);
}
Sachin
  • 121
  • 4
  • Can you comment on the filename and path you are creating? If this was to update a book model record, would the the blade template be in `/resources/views/vendor/backpack/crud/book/edit.blade.php`? I haven't quite worked it out. – Dubby Aug 29 '17 at 07:57
  • I worked it out. In my case I wanted to edit a course record so I created a file in `/resources/views/course/edit.blade.php` and called this with `view('course.edit')`. – Dubby Aug 30 '17 at 00:44
9

Found a way not even having to override the index() method, just use $this->crud->setListView() in your setup method of your CrudController, ex:

$this->crud->setListView('backpack::crud.different_list', $this->data);

thus, it will get the view under '/resources/views/vendor/backpack/crud/different_list.blade.php' instead of the default one in the package.

Besides setListView(), setEditView(), setCreateView(), setUpdateView()....are also available. hope it helps.

you can refer to https://laravel-backpack.readme.io/docs/crud-full-api for more detail.

// use a custom view for a CRUD operation
$this->crud->setShowView('your-view');
$this->crud->setEditView('your-view');
$this->crud->setCreateView('your-view');
$this->crud->setListView('your-view');
$this->crud->setReorderView('your-view');
$this->crud->setRevisionsView('your-view');
$this->crud->setRevisionsTimelineView('your-view');
$this->crud->setDetailsRowView('your-view');
Ryan Ye
  • 121
  • 1
  • 6
5

Before loading any views, Backpack for Laravel checks your resources/views/vendor/backpack/crud folder to see if you have any custom views. If you don't, it will just load the views in the package.

If you want to overwrite a blade file for all CRUDS, you can just place a file with the right name in the right folder. Take a look at how the files are organized in the package.

If you want to overwrite a blade file for just one CRUD, use Sachin's solution.

Community
  • 1
  • 1
tabacitu
  • 6,047
  • 1
  • 23
  • 37
1

There's actually a better way for newer versions of backpack (^version 5x). Copied directly from the documentation: Overriding Show Operation

In case you need to modify the show logic in a meaningful way, you can create a show() method in your EntityCrudController. The route will then point to your method, instead of the one in the trait. For example:

use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation { show as traitShow; }

public function show($id)
{
    // custom logic before
    $content = $this->traitShow($id);
    // cutom logic after
    return $content;
}

Then just do your regular laravel stuff for example, return a view:

return view('entity.show', ['data' => $data]);
Imtiaz
  • 2,484
  • 2
  • 26
  • 32