Si cargo una tabla hardcodeada en HTML con DataTable no hay problema y funciona bien.
HTML:
<link rel="stylesheet" href="https://cdn.datatables.net/2.0.7/css/dataTables.dataTables.min.css">
<script src="https://code.jquery.com/jquery-3.7.1.js"></script>
<script src="http://cdn.datatables.net/2.0.7/js/dataTables.min.js"></script>
<script>
$(document).ready( function () {
$('#users').DataTable();
});
</script>
Hasta aquí el resultado es perfecto, pero si llamo con Ajax a una función del controller para conectar con la DB, me da error 404. Ni siquiera llega a entrar en el controller.
<script>
$(document).ready(function() {
$('#users').DataTable({
serverSide: true,
processing: true,
ajax: {
url: '<?= base_url("home/get_datatables") ?>',
type: 'get',
},
columns: [
{data: "id"},
{data: "username"},
{data: "status"},
{data: "active"},
{data: "perPage"},
{data: "locale"},
{data: "last_active"},
{data: "created_at"},
{data: "updated_at"},
{data: "deleted_at"}
]
});
});
</script>
En en controller Home
está la función get_datatables()
que ejecuta la consulta a la tabla en la DB, pero como decía, no llega ni a entra en la función por el error 404.
Esta es la función:
public function get_datatables()
{
$valor_buscado = $this->request->getGet('search')['value'];
$table_map = [
0 => 'id',
1 => 'username',
2 => 'status',
3 => 'active',
4 => 'perPage',
5 => 'locale',
6 => 'last_active',
7 => 'created_at',
8 => 'updated_at',
9 => 'deleted_at'
];
$sql_count = "SELECT count(id) AS total FROM users";
$sql_data = "SELECT * FROM users";
$condition = "";
if(!empty($valor_buscado)) {
foreach ($table_map as $key => $val) {
if($table_map[$key] == 'id') {
$condition .= "WHERE " . $val . " LIKE '%" . $valor_buscado . "%'";
} else {
$condition .= "OR " . $val . " LIKE '%" . $valor_buscado . "%'";
}
}
}
$sql_count = $sql_count . $condition;
$sql_data = $sql_data . $condition;
$total_count = $this->db->query($sql_count)->getRow();
$sql_data .= "ORDER BY " . $table_map[$this->request->getGet('order')[0]['column']] . "
" . $this->request->getGet('order')[0]['dir'] . " LIMIT " . $this->request->getGet('start').",
" . $this->request->getGet('length') . "";
$data = $this->db->query($sql_data)->getResult();
$json_data = [
'draw' => intval($this->request->getGet('draw')),
'recordsTotal' => $total_count->total,
'recordsFiltered' => $total_count->total,
'data' => $data
];
echo json_encode($json_data);
}
Se agradecen ideas.
app/Config/Routes.php
a menos que tengas habilitada la opción de Auto Routing. La ruta se debe definir de la siguiente forma$routes->get('home/get_datatables', 'Home::get_datatables');