¿Porque usaría ajax con este componente?
En el ejemplo anterior Datepicker + base de datos se me presentó el problema de acceder a la variable $query de php desde javascript, me pareció que debía ser engorroso el tratar de hacer algún cambio al código cada vez que quiera añadir o modificar algo, por otra parte si requiriera que el componente actualizara los datos y al pertenecer este a un formulario no me gustaría que el usuario perdiera toda la información que ya ha llenado al hacer una actualización completa de la página. Pienso que es más óptimo volver a recargar una parte pequeña de mi aplicación que toda la página web. Ahorrar recursos es mi objetivo y todo depende de ¿para qué necesito Ajax?.
Bien retomando el ejemplo anterior, tenemos el controller, el modelo, y la vista esta última contiene código javascript que puede decirse está embebido en el de php, mi objetivo es separar este código y acceder a los datos de mi tabla historial, pero antes de esto necesitamos cambiar algo de código en el controller.
dp.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?php class Dp extends CI_Controller { public function __construct() { parent::__construct(); // cargamos nuestro base de datos ahora lo hacemos por defecto $this->load->database(); $this->load->model('Historial_model'); } public function index() { // en este caso queremos que la vista haga las peticiones no el controller // cargamos nuestra vista $this->load->view('dp_view'); } public function datos_dp(){ // obtenemos los datos de la tabla y lo guardamos en la variable // datos $datos['query'] = $this->Historial_model->get_datos(); // codificamos el array a json usando json_encode mirar manual de php // no uso xml porque json está soportado nativamente en javascript // entonces creo no se deberia llamar Ajax sino Ajaj por json jejeje? $data_json = json_encode($datos); // enviamos el json a la vista echo $data_json; } |
La función datos_dp tiene como objetivo obtener los datos de la tabla historial y convertirlos en formato json(texto) para enviarlo por medio de un echo al cliente (dp_view.php).
Aquí esta el contenido de ese envio en json, usamos la misma tabla historial del ejemplo anterior:
{"query":[{"id":"1","fecha":"01\/12\/2010"},{"id":"2","fecha":"02\/09\/2012"}]}
json_encode($datos) Convierte el contenido de $datos['query'] a formato json texto, para mantener la estructura y el significado de los datos, la alternativa sería crear nuestro propio formato que represente la estructura de los datos y la tabla historial, pero para que inventar de nuevo la rueda.
Nuestra vista contiene 3 cambios importantes primero quité el código php y segundo incluí <script type="text/javascript" src="../js/dp.js"></script> que representa la ruta de mi javascript que lo he trasladado todo al archivo dp.js y controla la parte lógica del cliente, lo que nos permitirá enviar peticiones ajax a nuestro server en este caso a mi función datos_dp, y la parte <script language="JavaScript" type="text/javascript" src="../js/jquery.json-2.3.min.js"></script> carga la librería necesaria para poder convertir de texto json a un objeto json en javascript por medio de $.evalJSON(), aunque tambien jquery posee esta habilidad por medio de la función $.getJSON, prefiero usar la librería ya que posee métodos que necesitaremos más adelante para otros proyectos, analizaré posteriormente si incluirla o no.
dp_view.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!doctype html> <html lang="es"> <head> <link type="text/css" href="../js/css/smoothness/jquery-ui-1.8.17.custom.css" rel="stylesheet" /> <script type="text/javascript" src="../js/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="../js/jquery-ui-1.8.17.custom.min.js"></script> <script language="JavaScript" type="text/javascript" src="../js/jquery.json-2.3.min.js"></script> <script type="text/javascript" src="../js/dp.js"></script> </head> <body> <div> <input id="datepicker" type="text"> </div> </body> </html> |
A continuación tenemos nuestro javascript el cual contiene prácticamente el mismo código excepto la función $.ajax y var historial = $.evalJSON(msg), la función evalJSON hace el proceso inverso a jsonencode de php, lo que hace es convertir el texto recibido en formato json a un objeto json de javascript.
dp.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | jQuery(document).ready(function(){ //creamos el datepicker $("#datepicker").datepicker({ dateFormat: "dd/mm/yy" }); // llamamos por ajax a la función datos_dp $.ajax({ type: "POST", url: "dp/datos_dp", success: function(msg){ // se convierte de json a un objeto javascript var historial = $.evalJSON(msg); //observar con firebug la estructura del objeto $('#datepicker').datepicker('setDate', historial.query[0].fecha); } }); });// fin de ready function |
El resultado:
Se puede observar una mejor estructuración del código, desde mi punto de vista es más elegante y fácil de mantener.
No hay comentarios:
Publicar un comentario