Laravel-datatables: 401 ๊ถŒํ•œ ์—†์Œ

์— ๋งŒ๋“  2015๋…„ 09์›” 03์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: yajra/laravel-datatables

์˜ค๋Š˜ 5.11.7 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ Datatables ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐˆ ๋•Œ ajax์—์„œ ๋ฌด์ž‘์œ„๋กœ ์Šน์ธ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

    public function anyData()
    {
      $Patient = Patient::select('*')->withTrashed();
      return \Datatables::of($Patient)->make(true);
    }

๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ์„ ์–ธ์€

$(document).ready(function() {
    $('#dataTables-patients').DataTable({
      responsive: true,
      processing: true,
      serverSide: true,
      ajax: base_url+'/patient/data',
      language:{
        url:base_url+'/js/dataTables.Spanish.json'
      },
      columns:[
        {data:'dni', name:'dni'},
        {data:'first_name', name:'first_name'},
        {data:'last_name', name:'last_name'},
        {data:'birthday', name:'birthday'},
        {data:'id', name:'id'},
        {data:'active', name:'active'},
      ],
      "columnDefs": [{
        "targets": 4,
        "data": "id",
        "render": function ( data, type, row ) {
          if(row.active=="0"){
            return '<a class="btn btn-primary" href="'+base_url+'/patient/show/'+data+'">'+patient.view+'</a>'+
                   '<a class="btn btn-success respatient" data-id="'+data+'" href="#" >'+patient.restore+'</a>';
          }else{
            return '<a class="btn btn-primary" href="'+base_url+'/patient/show/'+data+'">'+patient.view+'</a>'+
                   '<a class="btn btn-danger delpatient" data-id="'+data+'" href="#" >'+patient.delete+'</a>';
          }
        }

      },
      { "orderable": false, "targets": [ 4 ] },
      { "bSearchable": false, "aTargets": [ 5 ] },
      { "visible": false,  "targets": [ 5 ] }
      ]
    });

});

Unauthorized๊ฐ€ ํญ๋ฐœํ•˜๋ฉด ์•ฑ์— ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ 6๋ฒˆ ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ , ๋•Œ๋กœ๋Š” ๋‘ ๋ฒˆ ๋“ค์–ด๊ฐ€๋„ ๋ฌด๋‹จ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

๋Œ“๊ธ€์„ ์ฝ์–ด๋ณด๋‹ˆ,
๋ฌธ์ œ๋ฅผ ์ž˜ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.
๋ณด๊ธฐ์—์„œ
var token = '{{ csrf_token() }}';

ajax: { url:'$url', type:'post', data: { '_token': token } },

`var ํ…Œ์ด๋ธ” = $('#myTable');

        oTable = table.dataTable({
            processing: true,
            serverSide: true,
            order: [[1, 'desc']],
            buttons: [
                { extend: 'print',  className: 'btn dark btn-outline'       },
                { extend: 'copy',   className: 'btn red btn-outline'        },
                { extend: 'pdf',    className: 'btn green btn-outline'      },
                { extend: 'excel',  className: 'btn yellow btn-outline'     },
                { extend: 'csv',    className: 'btn purple btn-outline'     },
                { extend: 'colvis', className: 'btn dark btn-outline', text: 'Columns'}
            ],
            ajax: {
                url:'$url',
                type:'post',
                data: {
                    '_token': token
                }
            },
            $col,
            \"oLanguage\": {
                \"sEmptyTable\":   \"No se encontraron resultados\",
                \"sInfo\":         \"Mostrando _START_ a _END_ de _TOTAL_ filas\",
                \"sInfoEmpty\":    \"No se encontraron resultados\",
                \"sInfoFiltered\": \"(Filtrado de _MAX_ total de filas)\",
                \"sLengthMenu\":   \"Ver _MENU_ filas\",
                \"sSearch\":       \"Buscar:\",
                \"sZeroRecords\":  \"No se encontraron resultados\"
            },
            \"aoColumnDefs\": [
                { \"bSortable\": false, \"aTargets\": [ 0,-1 ] }

,
{ \"iDataSort\": 1, \"๋Œ€์ƒ\": [ 0 ] },

                { \"sWidth\": \"20px\",   \"aTargets\": [ 0,-1 ]  },


            ]
        });


        table.on(\"keyup\", \"input[type=search]\", function () {
            /* Filter on the column (the index) of this element */
            oTable.fnFilter(this.value, $(\"thead input\").index(this));
        });

        $('#sample_1_tools > li > a.tool-action').on('click', function() {
            var action = $(this).attr('data-action');
            //console.log(action);
            oTable.DataTable().button(action).trigger();
        });

`

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

@mantrax314 , ์ด๊ฒƒ์€ ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์ •๋ง ์–ด๋ ค์šด ํ•˜๋‚˜์˜ ๊ณ ์ŠคํŠธ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ–ˆ์œผ๋ฉฐ ์ด ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก PR์„ ์ œ๊ณตํ•˜๊ณ  ๋„์™€์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์•ˆ๋…•ํ•˜์„ธ์š”,
์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ๋””๋ฒ„๊น…์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์†Œ์šฉ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Ajax๋ฅผ GET ๋Œ€์‹  POST ์š”์ฒญ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ๊ณ  ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ซ“๊ฒจ๋‚˜์ง€ ์•Š๊ณ  ๋‚ด ํŽ˜์ด์ง€๋ฅผ 50๋ฒˆ ์ƒˆ๋กœ๊ณ ์นจํ•˜์—ฌ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด ๋ฌธ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/yajra/laravel-datatables/issues/19

@Xyten ๊ณผ ๋™์ผํ•˜๊ฒŒ POST ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ POST๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ CSRF ํ† ํฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@mrofi , ํ† ํฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค. http://laravel.com/docs/5.1/routing#csrf -x-csrf-token

๋ฐฉ๊ธˆ Chumper Datatable์—์„œ https://github.com/Chumper/Datatable/issues/170 ๋ฌธ์ œ๋ฅผ ์ฝ์—ˆ์œผ๋ฉฐ ์šฐ๋ฆฌ์—๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mgsmus๋Š” 2014๋…„ 9์›” 16์ผ์— ๋Œ“๊ธ€์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "artisan serve"๋ฅผ ํ†ตํ•ด PHP์˜ ๋‚ด์žฅ ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Apache๋กœ ์ „ํ™˜ํ–ˆ๊ณ  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‚ด์žฅ ์„œ๋ฒ„๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

'์•„ํ‹ฐ์ฆŒ ์„œ๋ธŒ' ์“ฐ์‹œ๋Š” ๋ถ„ ๊ณ„์‹ ๊ฐ€์š”?

"์•„ํ‹ฐ์ž” ์„œ๋ธŒ"๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Œ ์ฐธ๊ณ . ๋นŒํŠธ์ธ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์‹ค์ œ ํ™˜๊ฒฝ์„ ํ‘œํ˜„ํ•  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ ๋‚˜์ค‘์— Apache๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค..

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, @yajra . btw ๊ท€ํ•˜์˜ ์ œ์•ˆ์œผ๋กœ csrf ํ† ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Laravel์—์„œ ๊ทธ ๋ฌธ์„œ๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. html ๋นŒ๋”์—์„œ ajax ์š”์ฒญ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mrofi , ํ™•์ธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์•„๋งˆ๋„ "์žฅ์ธ ๋ด‰์‚ฌ" ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ajax์˜ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์—ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

->ajax([
  'url' => 'url',
  'type' => 'post'
])

์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ๊ฐ€ "์žฅ์ธ ๋ด‰์‚ฌ"๋กœ ์ธํ•œ ๊ฒƒ์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. apache/nginx๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด ๋กœ์ปฌ๋กœ ์‚ฌ์šฉํ•˜์—ฌ Fedora ์‹œ์Šคํ…œ์—์„œ ์•„ํŒŒ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์•„์ด๋””์–ด?

๋‚˜๋Š”์ด ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ–ˆ๋‹ค.
๋Œ€์ฒด: ajax: '๋ฆฌ์†Œ์Šค',

์— ์˜ํ•ด:
์•„์•ฝ์Šค: {
URL: '๋ฆฌ์†Œ์Šค',
ํ—ค๋”: {'X-CSRF-TOKEN': ํ† ํฐ},
๋ฐ์ดํ„ฐ ์œ ํ˜•: 'JSON',
beforeSend: ํ•จ์ˆ˜(xhr) {
xhr.setRequestHeader('๊ถŒํ•œ ๋ถ€์—ฌ');
}
},

๋ช‡ ๊ฐ€์ง€ ํŒ
1) Ajax๋Š” POST ๋˜๋Š” GET์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ANY์—์„œ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
```
๊ฒฝ๋กœ::any('campos/data','CamposController @data ')->name('campos.data');

2) Dont forget add the token before the ajax calling (in my case is Laravel)

$.ajaxSetup({
ํ—ค๋”: {
'X-CSRF-TOKEN': '{{csrf_token()}}'
}
});

3) I have that issue in using php artisan on Windows. If you use on Linux or Apache you wont have errors. 
4) Error 401 is becouse the session was expired. You need a login again. You could handler the error and take some action

"์•„์•ฝ์Šค": "/๋ฆฌ์†Œ์Šค",
"์˜ค๋ฅ˜": ๊ธฐ๋Šฅ(์ด์œ ) {
console.log("์˜ค๋ฅ˜ ๋ฐœ์ƒ! ");
// ์—ฌ๊ธฐ์—์„œ ์ด์œ ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์˜ค๋ฅ˜ ์œ ํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
// ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ ์ ˆํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค.
}
```

๋Œ“๊ธ€์„ ์ฝ์–ด๋ณด๋‹ˆ,
๋ฌธ์ œ๋ฅผ ์ž˜ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.
๋ณด๊ธฐ์—์„œ
var token = '{{ csrf_token() }}';

ajax: { url:'$url', type:'post', data: { '_token': token } },

`var ํ…Œ์ด๋ธ” = $('#myTable');

        oTable = table.dataTable({
            processing: true,
            serverSide: true,
            order: [[1, 'desc']],
            buttons: [
                { extend: 'print',  className: 'btn dark btn-outline'       },
                { extend: 'copy',   className: 'btn red btn-outline'        },
                { extend: 'pdf',    className: 'btn green btn-outline'      },
                { extend: 'excel',  className: 'btn yellow btn-outline'     },
                { extend: 'csv',    className: 'btn purple btn-outline'     },
                { extend: 'colvis', className: 'btn dark btn-outline', text: 'Columns'}
            ],
            ajax: {
                url:'$url',
                type:'post',
                data: {
                    '_token': token
                }
            },
            $col,
            \"oLanguage\": {
                \"sEmptyTable\":   \"No se encontraron resultados\",
                \"sInfo\":         \"Mostrando _START_ a _END_ de _TOTAL_ filas\",
                \"sInfoEmpty\":    \"No se encontraron resultados\",
                \"sInfoFiltered\": \"(Filtrado de _MAX_ total de filas)\",
                \"sLengthMenu\":   \"Ver _MENU_ filas\",
                \"sSearch\":       \"Buscar:\",
                \"sZeroRecords\":  \"No se encontraron resultados\"
            },
            \"aoColumnDefs\": [
                { \"bSortable\": false, \"aTargets\": [ 0,-1 ] }

,
{ \"iDataSort\": 1, \"๋Œ€์ƒ\": [ 0 ] },

                { \"sWidth\": \"20px\",   \"aTargets\": [ 0,-1 ]  },


            ]
        });


        table.on(\"keyup\", \"input[type=search]\", function () {
            /* Filter on the column (the index) of this element */
            oTable.fnFilter(this.value, $(\"thead input\").index(this));
        });

        $('#sample_1_tools > li > a.tool-action').on('click', function() {
            var action = $(this).attr('data-action');
            //console.log(action);
            oTable.DataTable().button(action).trigger();
        });

`

@jarm-mcs ์†”๋ฃจ์…˜์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค :)

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  Ajax ๊ตฌ์„ฑ์—์„œ axios ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Laravel Passport๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ axios ํ˜ธ์ถœ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด bootstrap.js

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

/**
 * Next we will register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

๋‚ด DataTables ์Šคํฌ๋ฆฝํŠธ

$(function() {
            $('#users-table').DataTable({
                processing: true,
                serverSide: true,
                ajax: {
                    'url':'{!! route('api.games.index') !!}',
                    'headers':window.axios.defaults.headers.common
                },
                columns: [
                    { data: 'id', name: 'id' },
                    { data: 'name', name: 'name' },
                    { data: 'created_at', name: 'created_at' },
                    { data: 'updated_at', name: 'updated_at' }
                ]
            });
        });

๋Œ“๊ธ€์„ ์ฝ์–ด๋ณด๋‹ˆ,
๋ฌธ์ œ๋ฅผ ์ž˜ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.
๋ณด๊ธฐ์—์„œ
var token = '{{ csrf_token() }}';

ajax: { url:'$url', type:'post', data: { '_token': token } },

`var ํ…Œ์ด๋ธ” = $('#myTable');

        oTable = table.dataTable({
            processing: true,
            serverSide: true,
            order: [[1, 'desc']],
            buttons: [
              { extend: 'print',  className: 'btn dark btn-outline'       },
              { extend: 'copy',   className: 'btn red btn-outline'        },
              { extend: 'pdf',    className: 'btn green btn-outline'      },
              { extend: 'excel',  className: 'btn yellow btn-outline'     },
              { extend: 'csv',    className: 'btn purple btn-outline'     },
              { extend: 'colvis', className: 'btn dark btn-outline', text: 'Columns'}
          ],
            ajax: {
                url:'$url',
                type:'post',
                data: {
                    '_token': token
                }
            },
            $col,
            \"oLanguage\": {
              \"sEmptyTable\":   \"No se encontraron resultados\",
              \"sInfo\":         \"Mostrando _START_ a _END_ de _TOTAL_ filas\",
              \"sInfoEmpty\":    \"No se encontraron resultados\",
              \"sInfoFiltered\": \"(Filtrado de _MAX_ total de filas)\",
              \"sLengthMenu\":   \"Ver _MENU_ filas\",
              \"sSearch\":       \"Buscar:\",
              \"sZeroRecords\":  \"No se encontraron resultados\"
          },
          \"aoColumnDefs\": [
              { \"bSortable\": false, \"aTargets\": [ 0,-1 ] }

,
{ "iDataSort": 1, "aTargets": [ 0 ] },

              { \"sWidth\": \"20px\",   \"aTargets\": [ 0,-1 ]  },


            ]
        });


        table.on(\"keyup\", \"input[type=search]\", function () {
          /* Filter on the column (the index) of this element */
          oTable.fnFilter(this.value, $(\"thead input\").index(this));
      });

        $('#sample_1_tools > li > a.tool-action').on('click', function() {
            var action = $(this).attr('data-action');
            //console.log(action);
            oTable.DataTable().button(action).trigger();
        });

`

์†”๋ฃจ์…˜์— ๋Œ€ํ•œ thx.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰