Използвайте хранилища на Laravel с Datatables

В моя проект Laravel 5.1.* използвам хранилища чрез това https://github.com/andersao/l5-repository библиотека. За Datatables използвам тази https://github.com/yajra/laravel-datatables библиотека. Сега мога да получа данните от моето хранилище чрез инжектиране на зависимости в моя контролер.

namespace Admin\Http\Controllers;

use App\Repositories\Contracts\ModuleRepository;

class ModuleController extends Controller
{
    /**
     * @var ModuleRepository
     */
    protected $repository;

    /**
     * ModuleController constructor.
     *
     * @param ModuleRepository $repository
     */
    public function __construct(ModuleRepository $repository)
    {
        $this->repository = $repository;
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        return view('admin::pages.module.index');
    }

    /**
     * Return list with module data.
     *
     * @return mixed
     */
    public function data()
    {
        $modules = $this->repository->all();
        return $modules;
    }
}

Методът за данни се извиква чрез Ajax заявка от индексната страница.

    var oTable = $('#modules-table').DataTable({
        stateSave: true,
        processing: true,
        serverSide: true,
        rowReorder: true,
        ajax: {
            url: '{!! url('admin/module/data') !!}',
            type: 'POST',
            data: { _token: '{!! csrf_token() !!}' }
        },
        columns: [
            {data: 'sequence', name: 'sequence'},
            {data: 'display_name', name: 'display_name'},
            {data: 'active', name: 'active', orderable: false, searchable: false},
            {data: 'config', name: 'config', orderable: false, searchable: false}
        ],
        language: {
            url: '{{ asset('/admin/localization/nl/datatable.json') }}'
        }
    });

За да направя това да работи, трябва да върна екземпляр на Datatables от моя контролер по следния начин:

    return Datatables::of($modules)
        ->addColumn('active', function($module)
        {
            if (Config::get('modules.' . $module->name . '.active') == 1)
                return '<a href="/bg'. url('admin/module/' . $module->id . '/disable') .'" class="label success"><i class="fa fa-eye fa-fw"></i> Ingeschakeld</a>';
            else
                return '<a href="/bg'. url('admin/module/' . $module->id . '/enable') .'" class="label disabled"><i class="fa fa-eye-slash fa-fw"></i> Uitgeschakeld</a>';
        })
        ->addColumn('config', function($module)
        {
            return '<a href="/bg'. url('admin/module/' . $module->id . '/edit') .'" class="label info"><i class="fa fa-pencil fa-fw"></i> Configuratie</a>';
        })
        ->make(true);

Кое е най-доброто място за трансформиране на моите данни от хранилището в екземпляр на datatables? Трябва ли да създам трансформатор за това?


person kipzes    schedule 24.12.2015    source източник


Отговори (1)


Не мисля, че има нужда от създаване на презентатор, предлагам да направим нещата по-прости (това всъщност е моята практика).

поставих моята реализация на datatable в моя клас хранилище:

use Prettus\Repository\Eloquent\BaseRepository;

class MyRepository extends BaseRepository
{
    // .... 

    public function getDatatable()
    {
        $images = $this->model->select('*');
        return Datatables::of($images)
            ->addColumn('action', function ($p) {
                return '<a class="btn btn-xs btn-danger" onclick="return confirm(\'Delete this image ?\');" href="/bg'.action('Dashboard\\ImagesController@destroy', ['id'=>$p->id]).'"><i class="glyphicon glyphicon-remove"></i> Delete</a>';
            })
            ->addColumn('image', function ($p) {
                return '<a href="/bg'.$p->getMedia()[0]->getUrl().'"><img src="'.$p->getMedia()[0]->getUrl().'" class="img-responsive"></a>';
            })
            ->editColumn('created_at', '{!! $created_at->diffForHumans() !!}')
            ->make(true);
    }
}

и след това просто на вашия контролер

namespace Admin\Http\Controllers;

use App\Repositories\Contracts\ModuleRepository;

class ModuleController extends Controller
{

    protected $repository;

    // .......

    /**
     * Render a datatable instance
    */
    public function datatable()
    {
         return $this->repository->getDatatable();
    }
}
person Abdou Tahiri    schedule 29.12.2015