Laravel-datatables: Prise en charge de plusieurs tables de données dans la même vue

Créé le 10 mars 2017  ·  3Commentaires  ·  Source: yajra/laravel-datatables

Résumé du problème ou de la demande de fonctionnalité

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:

  • Le HtmlBuilder s'appuie sur la table existante au lieu de commencer à créer une nouvelle table
  • Le rendu du HTML et du script dans la vue est en conflit l'un avec l'autre

Mes questions :

  • Puis-je créer une deuxième table à l'aide de HtmlBuilder?
  • Existe-t-il un moyen de rendre chaque table unique (avec un ID?), De sorte que le rendu HTML et le script fonctionnent en fonction de cet ID?

Extrait de code du problème

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>

Détails du système

  • Système d'exploitation: Win 10 (Laragon 2.1.4)
  • Version PHP: 7.0.12
  • Version de Laravel: 5.4.15
  • Version Laravel-Datatables: 7.3.0

Capture d'écran

image 8

question

Tous les 3 commentaires

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 :

image 9

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!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

FilipeBorges1993 picture FilipeBorges1993  ·  3Commentaires

vipin733 picture vipin733  ·  3Commentaires

SGarridoDev picture SGarridoDev  ·  3Commentaires

t0n1zz picture t0n1zz  ·  3Commentaires

josiahke picture josiahke  ·  3Commentaires