-2

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.

4
  • Como tienes definida la ruta?
    – MR Dev
    Commented el 17 may. a las 18:44
  • No hay una ruta definida. Creo que no hace falta porque la llamada Ajax a la función es desde el script de la vista welcome_message.php que la carga el propio index.php que se llama cuando accedes a la app. ¿Es correcto asi?
    – Jota
    Commented el 17 may. a las 18:52
  • La ruta que intentas llamar debe estar definida en el archivo 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');
    – MR Dev
    Commented el 17 may. a las 19:14
  • Ya no había intentado y vi que sequía el 404. Lo he vuelto a intentar y pasa lo mismo. Gracias igual! Esta es parte de la petición que se ve en el navegador Mozilla 'localhost/datatables/public/home/…' Es correcta, pero nada.
    – Jota
    Commented el 17 may. a las 19:22

2 respuestas 2

1

Si estas pasando otros valores por GET entonces tu ruta se debe establecer así:

$routes->get('home/get_datatables?(:any)', 'Home::get_datatables/$1');

Los valores que se pasen a la función de deben recibir así:

$search = $this->request->getGet("search");
4
  • No le paso ningún valor. Este 'search' es el campo de de búsqueda que por defecto ofrece DataTables, y para guardar su valor en una variable se instancia así '$valor_buscado = $this->request->getGet('search')['value'];'. Esto lo en visto en un video de formación. Aquí el problema sigue en la petición ajax y el 404.
    – Jota
    Commented el 17 may. a las 19:48
  • La ruta que te compartí es precisamente para eso, yo la uso para lo mismo que intentas hacer, una solicitud con datatables usando AJAX. ?(:any) representa todo el código adicional que agrega datatables a la petición.
    – MR Dev
    Commented el 17 may. a las 19:52
  • La he incluido en Raoutes.php y sigue el 404. Creo que he revisado todo lo que corresponde a configuración, incluyendo .env '# DATABASE database.default.hostname = localhost database.default.database = datatables database.default.username = root' ... y si fuese algún link o script? Seguiré buscando a ver
    – Jota
    Commented el 18 may. a las 7:20
  • No recuerdo que haya un archivo llamado Raoutes.php creo que desde ahí está el problema
    – MR Dev
    Commented el 20 may. a las 14:22
0

El problema estaba en la definición de la ruta en ajax. Solo hace falta poner la ruta relativa y no la absoluta:

ajax: {
            url: 'home/get_datatables',
            type: 'get'
        }

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.