Laravel-datatables: ํ•œ ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ํƒญ์—์„œ 2 ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2017๋…„ 06์›” 12์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: yajra/laravel-datatables

๋ฌธ์ œ ์š”์•ฝ ๋˜๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ


์•ˆ๋…•ํ•˜์„ธ์š”, ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”.
์งˆ๋ฌธํ•˜๊ณ  ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํƒญ 2 ๊ฐœ๊ฐ€์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํƒญ # 1์€ ํ•˜๋ฃจ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ํƒญ # 2๋Š” ์‹œ๊ฐ„๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ๊ทธ ๋‘ ํƒญ์—์„œ ๋™์ผํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํƒญ # 1, ํƒญ # 2์— ์—ด ์ด๋ฆ„ ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์™œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๋ฌธ์ œ์˜ ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ

๋‚ด ์ปจํŠธ๋กค๋Ÿฌ์— ์ž˜๋ชป๋œ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

public function index(InsightDataTable $dataTable)
    {
        return $dataTable->render('admin.report.insight.index');
    }

๊ทธ๋ž˜์„œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์•„ ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋‚ด index.blade.php์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

@section('content')
    @include('admin.notification')
    <div class="row">
            <div class="col-xs-12">

                <div class="nav-tabs-custom">
                    <ul class="nav nav-tabs">
                        <li class="hari"><a href="#hari" data-toggle="tab">Hari</a></li>
                        <li class="jam"><a href="#jam" data-toggle="tab">Jam</a></li>
                    </ul>
                    <div class="tab-content">

                        <div class="hari tab-pane" id="hari">
                        <div class="row">
                <div class="btn-group pull-right" style="margin: 0 15px 15px 0;">
                    <a href="" class="btn btn-primary btn-header" id="export_file">{{ trans('label.download_excel') }}</a> 
                </div>
            </div>
                <div class="box">
                <div class="box-body">
                <table border="0" cellspacing="5" cellpadding="5">
                        <tbody>
                            <tr>
                                <td>Period:&nbsp;</td>
                                <td>
                                    <input type="text" class="form-control date-range" id="" style="width: 180px;text-align: center;">
                                </td>
                            </tr>
                        </tbody>
                    </table>
                    <br/>
                    {!! $dataTable->table(['class' => 'datatable table table-striped', 'cellspacing'=>"0", 'width'=>"100%"]) !!}
                </div>
            </div>
                        </div>

                      <div class="jam tab-pane" id="jam">
                            <div class="row">
                <div class="btn-group pull-right" style="margin: 0 15px 15px 0;">
                    <a href="" class="btn btn-primary btn-header" id="export_file">{{ trans('label.download_excel') }}</a> 
                </div>
            </div>
                <div class="box">
                <div class="box-body">
                <table border="0" cellspacing="5" cellpadding="5">
                        <tbody>
                            <tr>
                                <td>Period:&nbsp;</td>
                                <td>
                                    <input type="text" class="form-control date-range" id="" style="width: 180px;text-align: center;">
                                </td>
                            </tr>
                        </tbody>
                    </table>
                    <br/>
                    {!! $dataTable->table(['class' => 'datatable table table-striped', 'cellspacing'=>"0", 'width'=>"100%"]) !!}
                </div>
            </div>
                      </div>

                    </div>
                  </div>
                </div>

            </div>
<strong i="16">@endsection</strong>

@section('custom_js')
    <script> 
        dateSelection = false;
        $('.date-range').daterangepicker();
        $('.date-range').on('apply.daterangepicker', function(ev, picker) {
            $('#dataTableBuilder').on('preXhr.dt', function ( e, settings, data ) {
                data.firstDate = picker.startDate.format('YYYY-MM-DD');
                data.lastDate = picker.endDate.format('YYYY-MM-DD');
                merge_date = data.firstDate+'_'+data.lastDate;
            });       
            var table = $('#dataTableBuilder').DataTable();
           table.ajax.reload();
           dateSelection =true;                 
        });

        $("#export_file").click(function() {
            if(dateSelection == false) {
                window.location.href = "{{ url('admin/report/insight/export/all') }}";
            } else {
                window.location.href = "{{ url('admin/report/insight/export') }}/"+merge_date;
            }
            return false;
        });

    </script>
    {!! $dataTable->scripts() !!}
<strong i="17">@endsection</strong>

์‹œ์Šคํ…œ ์„ธ๋ถ€ ์ •๋ณด

์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค! ์ƒ๋žตํ•˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ / ํ‹ฐ์ผ“๋ณด๋‹ค ํ‹ฐ์ผ“์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.
  • ์šด์˜ ์ฒด์ œ : Ubuntu 16.04
  • PHP ๋ฒ„์ „ : 7
  • Laravel ๋ฒ„์ „ : 5.2
  • Laravel-Datatables ๋ฒ„์ „ : 6.0
question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

"์งง๋ง‰ ํ•œ ๋†๋‹ด:

    public function show(PrimaryDataTable $primaryDataTable, SecondDataTable $secondDataTable)
    {
        /**  Depend request we need to match proper class */
        return ${request()->get('table', 'primary') . 'DataTable'}->render(
            'resource.show',
            compact('primaryDataTable', 'secondDataTable')
        );
    }

๋˜ํ•œ ์ถ•์†Œ ๋œ ajax์—์ฃผ์˜ํ•˜๊ณ ,์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•œ ํ›„ ajax ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋“  9 ๋Œ“๊ธ€

๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ด๋ธ”์— ์„œ๋น„์Šค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋” ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. .. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? :

UsersDatatableController
์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋…์ ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋ณด๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•˜๊ณ  ajax ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

PostsDatatableController
๊ฒŒ์‹œ๋ฌผ (์ผ๋ฐ˜ ๋˜๋Š” ์‚ฌ์šฉ์ž ๊ด€๋ จ)์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋…์ ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋ณด๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•˜๊ณ  ajax ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

UsersController
๋ Œ๋”๋ง์„ ์œ„ํ•ด UsersDatatableController ๋ฐ PostsDatatableController๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋™์ผํ•œ ๋ทฐ, ํƒญ, ์˜ค๋ฒ„ ์–ธ๋” ๋“ฑ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์˜ ajax ํ˜ธ์ถœ์€์ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌ์ƒํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์ด์žˆ๋Š” ์ผ๋ฐ˜ ํŽ˜์ด์ง€ ๋Œ€์‹  ํŽธ์ง‘ ์–‘์‹์„์œ„ํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์„œ๋ฒ„ ์ธก ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ
https://github.com/imanghafoori1/laravel-widgetize
์ด
https://stackoverflow.com/questions/41857905/using-laravel-controllers-as-components-to-build-a-view

ํ—‰
Lemme ๋‹น์‹ ์˜ ์ƒ๊ฐ thx๋ฅผ ์•Œ๊ณ 

@isometriq atm, ๊ธฐ๋ณธ์ ์œผ๋กœ ajax ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋™์ผํ•œ ๊ฒฝ๋กœ ๋‚ด์—์„œ ๋‘ ๊ฐœ์˜ DataTable ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ฒญ๋˜๋Š” ajax ์‘๋‹ต์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ถ”๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public function index(UsersDatatable $udt, PostsDatatable $pdt) {
  if (request()->get('table') == 'posts') {
    return $udt->render('my.view', compact('udt', 'pdt'));
  }

  return $pdt->render('my.view', compact('udt', 'pdt'));
}

๊ทธ๋Ÿฐ ๋‹ค์Œ๋ณด๊ธฐ์—์„œ ๋‘ DT ๋ชจ๋‘์— ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{!! $udt->html()->table() !!} // users table
{!! $pdt->html()->table() !!} // posts table

{!! $udt->scripts() !!} // users table scripts
{!! $pdt->scripts() !!} // posts table scripts

ํƒ์ƒ‰์„ ์‹œ๋„ ํ•  ์ˆ˜์žˆ๋Š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @yajra ๋ช‡ ๊ฐ€์ง€ ์‹œ๋„ํ•ด ๋ณผ๊ฒŒ์š”

์ด ์งˆ๋ฌธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. @yajra๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ ์ž‘๋™

{!! $udt->html()->table(['id' => 'udt']) !!} // users table
{!! $pdt->html()->table(['id' => 'pdt']) !!} // posts table

{!! $udt->html()->scripts() !!} // users table scripts
{!! $pdt->html()->scripts() !!} // posts table scripts

js๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก ๊ฐ ํ…Œ์ด๋ธ”์— ๊ณ ์œ  ํ•œ id ์†์„ฑ์„ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  DataTable ํด๋ž˜์Šค์—์„œ html () ๋ฉ”์„œ๋“œ์˜ ์ถ”๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

public function html() {

    return $this->builder()
        ->ajax(['data' => 'function(d) { d.table = "posts"; }'])
        ->parameters($this->getBuilderParameters());
}

@yajra ๋Š” https://datatables.yajrabox.com/services/two-datatables ์˜ ์ตœ์‹  ๋ฌธ์„œ์—์ด ์˜ˆ์ œ๊ฐ€ ๋Œ€์‹  ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@benlwong ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ฐ๋ชจ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š”์ด ๊ฒŒ์‹œ๋ฌผ์˜ ์†”๋ฃจ์…˜์„ ๋”ฐ๋ž๊ณ  ๋™์‹œ์— ์ž‘์—…ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค!
ํ•˜์ง€๋งŒ .. ์ผ๋ฐ˜ ํŽ˜์ด์ง€๊ฐ€๋กœ๋“œ ๋  ๋•Œ ๋™์‹œ์—๋กœ๋“œ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠน์ • ํƒญ / ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ•  ๋•Œ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„๋กœ๋“œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
ํŽ˜์ด์ง€์—์„œ ๋ณด์•˜์Šต๋‹ˆ๋‹ค : https://datatables.yajrabox.com/services/two-datatables

function postsDataTables() {
    if (!$.fn.dataTable.isDataTable('#postsTable')) {
        $('#postsTable').DataTable({
            dom: 'Bfrtip',
            processing: true,
            serverSide: true,
            order: [[0, 'desc']],
            buttons: [
                'csv', 'excel', 'pdf', 'print', 'reset', 'reload'
            ],
            ajax: '/services/two-datatables/posts',
            columns: [
                {data: 'id', name: 'posts.id'},
                {data: 'title', name: 'posts.title'},
                {data: 'created_by', name: 'users.name', width: '110px'},
                {data: 'created_at', name: 'posts.created_at', width: '120px'},
                {data: 'updated_at', name: 'posts.updated_at', width: '120px'},
            ],
            order: [[0, 'desc']]
        });
    }
}

๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ datatable์˜ JS๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” if ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€๋งŒ์ด ๊ฒŒ์‹œ๋ฌผ์—์„œํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ DataTable Service ๊ตฌํ˜„์„ ํ†ตํ•œ ์†”๋ฃจ์…˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ™์€:

function postsDataTables() {
    if (!$.fn.dataTable.isDataTable('#postsTable')) {

        {!! $secondDataTable->html()->scripts() !!}

    }
}

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ "scripts ()"ํ•จ์ˆ˜๊ฐ€ ํƒœ๊ทธ๋ฅผ ์ธ์‡„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.