์๋
ํ์ธ์, ์ข์ ํ๋ฃจ ๋์ธ์.
์ง๋ฌธํ๊ณ ๋์์ด ํ์ํฉ๋๋ค. ํญ 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: </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: </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>
๊ทธ๋ฌ๋ ํ ์ด๋ธ์ ์๋น์ค ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ํ ์ด๋ธ์๋ ๋ค๋ฅธ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค. ์ผ๊ด์ฑ์ ์ํด ๋ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์ถ์ต๋๋ค. .. ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น? :
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 ()"ํจ์๊ฐ ํ๊ทธ๋ฅผ ์ธ์ํ๊ธฐ ๋๋ฌธ์ ์ํ ํ ์ ์์ต๋๋ค. itself.
I don't know if what I'm asking is very easy to solve, or I'll have to write manually the JavaScript of the datatable and dispense DataTable Service in the second table.
Thanks for your attention. @yajra
๊ทํ์ ์ ์์ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง Method Yajra\DataTables\Html\Builder::html does not exist.
์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด๊ฐ ๋ญ ๋์น ๊ฑฐ ์๋? ๋ฟก๋ฟก
"์งง๋ง ํ ๋๋ด:
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 ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
"์งง๋ง ํ ๋๋ด:
๋ํ ์ถ์ ๋ ajax์์ฃผ์ํ๊ณ ,์ด ๋ฉ์๋๋ฅผ ํธ์ถ ํ ํ ajax ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ญ์์ค.