2015-12-24 24 views
5

Nel mio progetto Laravel 5.1. * Utilizzo i repository tramite questa libreria https://github.com/andersao/l5-repository. Per i Datatables utilizzo questa libreria https://github.com/yajra/laravel-datatables. Ora posso ottenere i dati dal mio repository tramite dipendenza dal mio controller.Utilizzare i repository Laravel con i 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; 
    } 
} 

Il metodo dati viene chiamato tramite una richiesta Ajax dalla pagina dell'indice.

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') }}' 
     } 
    }); 

Per fare questo lavoro devo restituire un'istanza DataTable dal mio controller in questo modo:

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

Qual è il posto migliore per trasformare i miei dati del repository a un'istanza DataTable? Devo creare un trasformatore per questo?

risposta

1

Non penso che sia necessario creare un presentatore, suggerisco di rendere le cose più semplici (in realtà è la mia pratica).

ho messo la mia implementazione datatable nella mia classe repository:

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="'.action('Dashboard\\[email protected]', ['id'=>$p->id]).'"><i class="glyphicon glyphicon-remove"></i> Delete</a>'; 
      }) 
      ->addColumn('image', function ($p) { 
       return '<a href="'.$p->getMedia()[0]->getUrl().'"><img src="'.$p->getMedia()[0]->getUrl().'" class="img-responsive"></a>'; 
      }) 
      ->editColumn('created_at', '{!! $created_at->diffForHumans() !!}') 
      ->make(true); 
    } 
} 

e poi semplicemente sul controller

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(); 
    } 
}