J'ai 2 datatables que je dois montrer sur la même page. Ils s'habituent déjà à leur propre page, mais la page du tableau de bord devra les contenir tous les deux.
Les problèmes que je rencontre:
Mes questions :
Dans mon ServiceProvider:
public function boot()
{
View::composer(['dashboard', 'user.index'], function(\Illuminate\View\View $view){
$userTable = Datatables::getHtmlBuilder()
->addColumn(['data' => 'username', 'name' => 'username', 'title' => trans('messages.username')])
->addColumn(['data' => 'name_en', 'name' => 'name_en', 'title' => trans('messages.name (english)')])
->addColumn(['data' => 'name_jp', 'name' => 'name_jp', 'title' => trans('messages.name (japanese)')])
->addColumn(['data' => 'phone_number', 'name' => 'phone_number', 'title' => trans('messages.phone number')])
->addColumn(['data' => 'extension', 'name' => 'extension', 'title' => trans('messages.extension')])
->addAction([])
->ajax(route('user_index_data'))
;
$view->with('userTable', $userTable);
});
View::composer(['dashboard', 'group.index'], function(\Illuminate\View\View $view) {
$groupTable = DataTables::getHtmlBuilder()
->addColumn(['data' => 'username', 'name' => 'username', 'title' => trans('messages.group username')])
->addColumn(['data' => 'name', 'name' => 'name', 'title' => trans('messages.group name')])
->addColumn(['data' => 'users', 'name' => 'users', 'title' => trans('messages.active users')])
->addAction([])
->ajax(route('group_index_data'));
$view->with('groupTable', $groupTable);
});
}
Dans le dashboard.blade.php
@section('content')
<div class="row">
<div class="col-sm-6 col-xs-12">
{!! $userTable->table() !!}
{!! $userTable->scripts() !!}
</div>
</div>
<div class="row">
<div class="col-sm-6 col-xs-12">
{!! $groupTable->table() !!}
{!! $groupTable->scripts() !!}
</div>
</div>
<strong i="20">@endsection</strong>
J'ai fouillé et j'ai trouvé un moyen de le faire fonctionner.
J'enregistre mes propres constructeurs:
public function register()
{
$this->app->bind('datatables.html.userTable', function () {
return $this->app->make(Builder::class);
});
$this->app->bind('datatables.html.groupTable', function () {
return $this->app->make(Builder::class);
});
}
Ensuite, dans la méthode de démarrage (), j'utilise les constructeurs et définit l'attribut de table 'id':
public function boot()
{
View::composer(['dashboard', 'user.index'], function(\Illuminate\View\View $view){
$userTableBuilder = app('datatables.html.userTable');
$userTable = $userTableBuilder
->setTableAttribute('id', 'userTable')
->addColumn(['data' => 'username', 'name' => 'username', 'title' => trans('messages.username')])
->addColumn(['data' => 'name_en', 'name' => 'name_en', 'title' => trans('messages.name (english)')])
->addColumn(['data' => 'name_jp', 'name' => 'name_jp', 'title' => trans('messages.name (japanese)')])
->addColumn(['data' => 'phone_number', 'name' => 'phone_number', 'title' => trans('messages.phone number')])
->addColumn(['data' => 'extension', 'name' => 'extension', 'title' => trans('messages.extension')])
->addAction([])
->ajax(route('user_index_data'))
;
$view->with('userTable', $userTable);
});
View::composer(['dashboard', 'group.index'], function(\Illuminate\View\View $view) {
$groupTableBuilder = app('datatables.html.groupTable');
$groupTable = $groupTableBuilder
->setTableAttribute('id', 'groupTable')
->addColumn(['data' => 'username', 'name' => 'username', 'title' => trans('messages.group username')])
->addColumn(['data' => 'name', 'name' => 'name', 'title' => trans('messages.group name')])
->addColumn(['data' => 'users', 'name' => 'users', 'title' => trans('messages.active users')])
->addAction([])
->ajax(route('group_index_data'));
$view->with('groupTable', $groupTable);
});
}
Capture d'écran :
La recherche et le tri fonctionnent.
@Mopster Je pense que vous pouvez également utiliser ci-dessous app('datatables.html')
:
public function boot()
{
View::composer(['dashboard', 'user.index'], function(\Illuminate\View\View $view){
$userTable = app('datatables.html')
->addColumn(['data' => 'username', 'name' => 'username', 'title' => trans('messages.username')])
->addColumn(['data' => 'name_en', 'name' => 'name_en', 'title' => trans('messages.name (english)')])
->addColumn(['data' => 'name_jp', 'name' => 'name_jp', 'title' => trans('messages.name (japanese)')])
->addColumn(['data' => 'phone_number', 'name' => 'phone_number', 'title' => trans('messages.phone number')])
->addColumn(['data' => 'extension', 'name' => 'extension', 'title' => trans('messages.extension')])
->addAction([])
->ajax(route('user_index_data'))
;
$view->with('userTable', $userTable);
});
View::composer(['dashboard', 'group.index'], function(\Illuminate\View\View $view) {
$groupTable = app('datatables.html')
->addColumn(['data' => 'username', 'name' => 'username', 'title' => trans('messages.group username')])
->addColumn(['data' => 'name', 'name' => 'name', 'title' => trans('messages.group name')])
->addColumn(['data' => 'users', 'name' => 'users', 'title' => trans('messages.active users')])
->addAction([])
->ajax(route('group_index_data'));
$view->with('groupTable', $groupTable);
});
}
L'utilisation de Datatables::getHtmlBuilder()
renverra toujours une seule instance, tandis que son appel dans l'IoC créera une nouvelle instance.
@yajra en effet! Merci!