CRUD de un catálogo de contactos Más videos
Descripción del tema
Resultado Final
La Base de Datos
La información para el EditorGrid estará en una base de datos de MySQL que contendrá una tabla llamada “contacts”, en esta tabla solo tenemos la información básica de un contacto. El código para generar la tabla se muestra a continuación.-- phpMyAdmin SQL Dump -- version 3.2.0.1 -- http://www.phpmyadmin.net -- -- Servidor: localhost -- Tiempo de generación: 18-10-2010 a las 13:25:06 -- Versión del servidor: 5.1.36 -- Versión de PHP: 5.3.0 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de datos: `test` -- -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `contacts` -- CREATE TABLE IF NOT EXISTS `contacts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `firstName` varchar(30) COLLATE utf8_unicode_ci NOT NULL, `lastName` varchar(39) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10 ; -- -- Volcar la base de datos para la tabla `contacts` -- INSERT INTO `contacts` (`id`, `email`, `firstName`, `lastName`) VALUES (1, 'pedro@gmail.com', 'Pedro', 'Lopez'), (2, 'jose@hotmail.com', 'Jose', 'Paz'), (3, 'john@hotmail.com', 'John', 'Smith');La base de datos se llama “test” pero puedes usar el nombre que te agrade, solo recuerda cambiar el nombre cuando se haga la conexión mediante PHP.
Exponer la Información
Como la información está almacenada en una base de datos, necesitamos realizar la conexión vía PHP o cualquier otro lenguaje de servidor y un simple “SELECT” de la siguiente manera. El siguiente código se debe escribir en un archivo llamado “serverside/getContacts.php”.<?php //step 1 $connection= mysql_connect("localhost","root","") or die("Connection Failed".mysql_error()); mysql_select_db("test",$connection)or die("Error loading the DataBase".mysql_error()); $result= mysql_query("SELECT * FROM contacts"); //step 2 $data= array(); while($row= mysql_fetch_array($result)){ //step 3 array_push($data,array( "id" => $row["id"], "first" => $row["firstName"], "last" => $row["lastName"], "email" => $row["email"], )); } echo json_encode( //step 4 array( "success" => true, "data" => $data ));En el paso uno se realiza la conexión a la base de datos, recuerda que debes poner las credenciales adecuadas así como la base de datos que usarás, en mi caso es “test”. En el paso dos se hace el query que regresa todo lo que contiene la tabla “contacts”, es un query muy sencillo. En el paso tres se itera el resultset que regresó la consulta, dentro del ciclo creamos un arreglo con la información de cada uno de los contactos. En el paso cuatro se imprime la información en formato JSON, la respuesta será como el siguiente ejemplo:
{"success":true,"data":[{"id":"1","first":"Pedro","last":"Lopez","email":"pedro@gmail.com"},{"id":"2","first":"Jose","last":"Paz","email":"jose@hotmail.com"}}Con eso es suficiente para poder generar mediante JavaScript la interface del Grid ya que tenemos toda la información necesaria.
Empaquetando el Tutorial
Vamos a empaquetar el código para evitar conflictos con otras variables. Esto es algo muy importante y siempre lo debemos realizar.Ext.ns("com.quizzpot.tutorials"); com.quizzpot.tutorials.Crud = { init : function() { //code } } Ext.onReady(com.quizzpot.tutorials.Crud.init,com.quizzpot.tutorials.Crud);La función “init” se ejecutará tan pronto como el DOM esté listo, por lo tanto ahí debemos colocar el código que necesitamos ejecutar primero.
Creado el CRUD
Lo que haremos a continuación es solicitar la información al servidor, esto será ya dentro de la función “init” de nuestro archivo “crudexample.js”. Como mencionamos anteriormente usaremos un writer que se encargue de hacer las operaciones básicas (leer, escribir, modificar y eliminar). Para lograr esto es necesario definir la propiedad “api” con las URLs donde el “proxy” realizará las peticiones Ajax de manera automática, nótese que no estamos usando la propiedad “url” que normalmente usamos.var proxy = new Ext.data.HttpProxy({ //step 1 api: { //step 2 read : "serverside/getContacts.php", create : "serverside/createContact.php", update : "serverside/updateContact.php", destroy : "serverside/destroyContact.php" } });En el paso uno se crea una instancia de “Ext.data.HttpProxy” esto es para que el “store” realice las peticiones Ajax de manera automática. En el paso dos usamos la configuración “api” con las URLs a donde se realizarán las peticiones Ajax para cada acción a realizar. Por el momento solo tenemos definido el archivo “getContacts.php”, los demás los definiremos más adelante. A continuación haremos el “Reader” y el “Writer”:
var reader = new Ext.data.JsonReader({ //step 1 totalProperty : "total", successProperty : "success", // indica la propiedad que define si se ha insertado/actualizado o borrado con éxito messageProperty : "message", idProperty : "id", root : "data" //este es el nombre del parámetro que llega al servidor con el JSON modificado },[ //step 2 {name: "email", allowBlank: false}, {name: "first", allowBlank: false}, {name: "last", allowBlank: false} ]); var writer = new Ext.data.JsonWriter({ //step 3 encode : true, writeAllFields : true//decide si se manda al servidor solamente los campos modificados o todo });En el paso uno lo que hacemos es crear una instancia del “JsonReader” este componente nos permitirá leer e interpretar la respuesta del servidor para cada petición Ajax realizada. Lo que tenemos que notar es el atributo “messageProperty” que define la propiedad que aloja un mensaje en la respuesta del servidor, otra propiedad importante es “successProperty” la cual indicará si la operación ha sido realizada con éxito. En el paso dos colocamos los campos que conforman el “Record” que contendrá la información que usaremos en el grid. En el paso tres se crea la instancia del “JsonWriter”, el atributo “encode” lo usamos para poner la información que se escribe en el grid en formato JSON, el atributo “writeAllFields” forza al “writer” a enviar todos los campos del record y no solamente aquellos que se han modificado. Lo siguiente es hacer el store que tendrá al “JsonReader”, “JsonWriter” y al “HttpProxy”. Lo haremos de la siguiente manera:
this.storeGrid = new Ext.data.Store({ //step 1 id : "id", proxy : proxy, reader : reader, writer : writer, autoSave : true //<--hace las peticiones al servidor automáticamente }); this.storeGrid.load(); //step 2En el paso uno lo que haces es hacer una instancia del store, esto es con el motivo de unir el “reader”, el “writer” y el “proxy”. Notemos que el “JsonWriter” es introducido al store de la misma manera de la que lo hacemos con el “JsonReader”, el store lo creamos como un objeto dentro de la función “init”. En el paso dos cargamos el store como siempre lo hemos hecho, esto ejecuta una petición Ajax al servidor. Con esto tenemos lo preparado al store para poder hacer las operaciones del CRUD de manera automática y muy sencilla.
Creando un Grid Editable
A continuación crearemos el grid editable, lo primero que haremos es hacer el grid y desplegar la información que traemos desde la base de datos.var textFieldEmail = new Ext.form.TextField({vtype: "email",allowBlank: false}), //step 1 textField = new Ext.form.TextField({allowBlank: false}), sm = new Ext.grid.CheckboxSelectionModel(); this.grid = new Ext.grid.EditorGridPanel({ //step 2 store : this.storeGrid, //step 3 columns : [ sm, {header:'E-mail', dataIndex:'email', sortable: true, width:150, editor:textFieldEmail}, {header:'Name', dataIndex:'first',sortable: true, editor:textField}, {header:'Lastname', dataIndex:'last',sortable: true, editor:textField} ], sm : sm, border : false, stripeRows : true });En el paso uno creamos lo necesario para poder hacer cambios a nuestra tabla, lo que hicimos fue crear una instancia de “TextField” con un vtype de tipo “email”, esto es con el fin de que cuando se intente hacer un cambio o crear un nuevo contacto se haga un validación de que lo que se introdujo sea una dirección de correo electrónico válida. Y por ultimo con el “allowBlank” no dejamos que el campo este vacío. Se crea una segunda instancia de “TextField” pero esta no cuenta con un vtype ya que en esta no se tiene que hacer alguna validación de ese tipo pero si tiene el “allowBlank” para no permitir que este campo este vacío. Por último creamos un “checkBox” para hacer el selectionModel. El resto del código es conocido para nosotros si no te recomendamos ver los tutoriales sobre esto. En el paso dos creamos la tabla que editaremos. En el paso tres le pasamos el “storeGrid” que contiene la información a desplegar en el grid. Por último colocaremos nuestra tabla en una ventana para poder mostrar los registros de esta.
var win = new Ext.Window({ title : "CRUD Example", layout : "fit", tbar : [ {text:'New Contact', scope:this, handler:this.addContact,iconCls:'save-icon'}, {text:"Delete", scope:this, handler:this.onDelete,iconCls:'delete-icon'}], width : 400, height : 300, items : [this.grid] }); win.show();Creamos la ventana esto ya es conocido para nosotros. Es importante mencionar que se crean los botones de “Nuevo Contacto” y “Eliminar” en la barra de herramienta, es importante mencionar que se les esta colocando una imagen a los botones, para esto es necesario definir las clases CSS (save-icon) y CSS(delete-icon) en nuestra hoja de estilos o documento HTML de la siguiente manera:
.save-icon{background:transparent url(icons/add.png) 0 0 no-repeat !important;} .delete-icon{background:transparent url(icons/delete.png) 0 0 no-repeat !important;}Por el momento no trabajaremos con las funciones que están en los botones ya que lo haremos un poco más adelante así que puedes comentar el atributo “handler”. En este momento deberíamos tener algo como lo siguiente imagen:
Mostrar los contactos
Grabar los Registro Modificados
Hasta este punto tenemos la información en nuestro “Grid” lo siguiente que tenemos que hacer para poder cumplir una de las funciones del CRUD es editar los registros del “Grid” y guárdarlos en la base de datos. En este momento si editamos un registro no se actualiza en la base de datos, pero si se cambia en el “Grid”. Al intentar hacer esto nos marca el siguiente error:POST serverside/updateContact.php 404 Not FoundEl error 404 nos indica que la url no existe, así que vamos a crear el archivo “serverside/updateContact.php”, este archivo es el que se conecta a la base de datos para poder actualizar el registro, a continuación veremos la estructura de este archivo.
<?php //step 1 $connection=mysql_connect("localhost","root","") or die("Connection Failed".mysql_error()); mysql_select_db("test",$connection)or die("Error loading the DataBase".mysql_error()); $info = $_POST["data"]; $data = json_decode(stripslashes($info)); //step 2 $mail = $data->email; //step 3 $name = $data->first; $last = $data->last; $id = $data->id; //step 4 $query = sprintf("UPDATE contacts SET email = '%s', firstName = '%s', lastName = '%s' WHERE id=%d", mysql_real_escape_string($mail), mysql_real_escape_string($name), mysql_real_escape_string($last), mysql_real_escape_string($id)); $rs = mysql_query($query); echo json_encode(array( //step 5 "success" => mysql_errno() == 0, "msg" => mysql_errno() == 0?"Contact inserted successfully":mysql_error() ));En el paso uno se realiza la conexión a la base de datos, recuerda que debes poner las credenciales adecuadas así como la base de datos que usarás, en mi caso es “test”. En el paso dos, una vez que recibimos la información que mando el “Store” lo descodificamos con la función json_decode() de php con esto ya podemos acceder a la información que fue editada en el “Grid”, la función “stripslashes” elimina el carácter “\” que Apache le agrega, es posible que la configuración de tu servidor no lo haga, pero es bueno prevenir esto apra evitarnos errores en el futuro. En el paso tres obtenemos la información y la separamos en variables para poder insertarlas a la base de datos, esto es opcional ya que podríamos utilizar el mismo objeto $data. En el paso cuatro hacemos un “update” a la tabla en la que están guardados nuestros contactos y le damos como valores la información que fue mandada por el “Store”. En el paso cinco lo que hacemos es mandar un mensaje de éxito si es que todo sale bien, de lo contrario se manda el mensaje de error de mysql. Con esto si intentamos nuevamente hacer un cambio a un registro en el “Grid” veremos algo como lo siguiente:
Actualizar un contacto
{"success":true,"msg":"Contact inserted successfully"}Hasta este momento ya cumplimos con dos de las cuatro funciones de un CRUD leer y actualizar si notamos la mayor parte de esto fue manejado por el “proxy”, el “JsonReader” y el “JsonWriter” nosotros solo creamos los archivos php, esto nos fácilita mucho las cosas.
Crear un registro nuevo
En la sección anterior logramos guardar los registros que fueron modificados por el usuario, ahora vamos a insertar nuevos registros en el Grid, para esto usaremos la función (addContact) que fue asignada al botón “nuevo contacto” esta función nos ayudara a realizar lo antes mencionado.addContact : function(){ var contact = new this.storeGrid.recordType({ //step 1 first : "", last : "", email : "" }); //step 2 this.grid.stopEditing(); this.storeGrid.insert(0,contact); this.grid.startEditing(0,1); }Creamos la función dentro del objeto principal y en el paso uno hacemos un nuevo registro poniendo los campos en del “Grid” vacios para que después el usuario pueda introducir la información necesaria, también podríamos definir valores por defecto. En el paso dos con “stopEditing” nos aseguramos que el usuario no esté modificando los campos, en el momento que se decida introducir un nuevo contacto. Ya que nos aseguramos que no se están editando, insertamos el nuevo contacto con los campos vacíos, y por último permitimos al usuario editar los campos con “strartEditng(0,1)” notemos que éste recibe como parámetros la posición de la celda donde se inicia a editar donde “0” es el numero de fila y “1” es el número de columna. Si ejecutamos nuestra aplicación veremos algo semejante a la siguiente imagen:
Creando un contacto
POST serverside/createContact.php 404 Not FoundAl igual que en el caso anterior tenemos que crear el archivo “createContact.php” en el cual se hacer la conexión a la base de datos y se guarda el nuevo registro, la estructura del archivo se muestra a continuación:
<?php //step 1 $connection = mysql_connect("localhost","root","") or die("Connection Failed".mysql_error()); mysql_select_db("test",$connection)or die("Error loading the DataBase".mysql_error()); $info = $_POST["data"]; $data = json_decode(stripslashes($info)); //step 2 $name = $data->first; //step 3 $last = $data->last; $email = $data->email; //step 4 $query = sprintf("INSERT INTO contacts (email,firstName,lastName) values ('%s','%s','%s')", mysql_real_escape_string($email), mysql_real_escape_string($name), mysql_real_escape_string($last)); $rs = mysql_query($query); //step 5 echo json_encode(array( "success" => mysql_errno() == 0, "msg" => mysql_errno() == 0?"Contact inserted successfully":mysql_error(), "data" => array( array( "id" => mysql_insert_id(), "first" => $name, "last" => $last, "email" => $email ) ) ));La estructura de este archivo es muy semejante a la de los archivos previos. En el paso uno lo único que hacemos es hacer la conexión a la base de datos. En el paso dos decodificamos la información que nos manda el “Store”, esto lo hacemos mediante la función Json_decode() y le pasamos la información la cual es el registro que creó el usuario. En el paso tres lo que hacemos es sacar esa información y guardarla en unas variables para poder insertar esa información a la tabla “contacts” de nuestra base de datos. En el paso cuatro creamos el query que insertara los datos a la base de datos, es un query simple un “insert” le damos los campos y los valores que es la información que obtuvimos en el paso tres. En el paso cinco lo que hacemos es mandar un mensaje y la información que fue insertada al base de datos. Es muy importante mencionar que en el Json_encode que se está haciendo después del “success” y el “msg” mandamos la información que fue insertada a la base de datos, es muy importante mandar el “id” del nuevo registro, esto nos permitirá que los métodos update y delete funcionen correctamente, si no lo hacemos no funcionarán. Si intentamos insertar un nuevo registro esta será la respuesta:
{"success":true,"msg":"Contact inserted successfully","data":[{"id":4,"first":"Alejando","last":"Cruz","email":"alejandro@gmail.com"}]}Con esto ya podremos insertar un nuevo registro en nuestro “Grid” y en nuestra base de datos.
Eliminar un registro
En estos momentos solo hemos hecho lo necesario para poder leer los registros y desplegarlos en nuestro “Grid”, podemos añadir nuevo registros y editar los registros existentes. Lo único que nos hace falta es eliminar registros y con esto tendríamos las cuatro funciones del CRUD. Para esto crearemos la función a la que hace referencia el botón “eliminar”, lo que haremos es lo siguiente:onDelete : function(){ //step 1 var rows = this.grid.getSelectionModel().getSelections(); //step 2 if(rows.length === 0){ //step 3 return false; } this.storeGrid.remove(rows); //step 4 },En el paso uno creamos la función dentro del objeto principal. En el paso dos tomamos la instancia del “SelectionModel()” de nuestro “Grid”, con esto podemos obtener la información de las filas seleccionadas por el usuario mediante el método “getSelections()”. En el paso tres lo que hacemos es verificar que el usuario halla seleccionado algo, si no hay nada seleccionado o la selección del “Grid” esta vacía no se eliminará ningún registro ya que hacemos un return. En el paso cuatro ya que se verifico que es un registro que puede ser borrado lo elimina del “Grid” usando el método “remove” del store que contiene los records. Si intentamos hacer esto notaremos que efectivamente se borra del “Grid”, pero no se borra de nuestra base de datos, además nos manda el siguiente error:
POST serverside/destroyContact.php 404 Not FoundEste es el mismo mensaje que recibimos en las secciones anteriores, ya que aún no tenemos ese archivo PHP; este archivo se encarga de borrar el registro en la base de datos, es muy semejante a los que hemos hecho, su estructura es la siguiente:
<?php //step 1 $connection=mysql_connect("localhost","root","") or die("Connection Failed".mysql_error()); mysql_select_db("test",$connection)or die("Error loading the DataBase".mysql_error()); $id = json_decode(stripslashes($_POST["data"])); //step 2 //step 3 $query = sprintf("DELETE FROM contacts WHERE id = %d", mysql_real_escape_string($id)); $rs = mysql_query($query); //step 4 echo json_encode(array( "success" => mysql_errno() == 0, "msg" => mysql_errno() == 0?"Contact deleted successfully":mysql_error() ));En el paso uno lo que hacemos es crear la conexión a la base de datos. En el paso dos obtenemos la información que nos fue mandada, la descodificamos con Json_decode() y la guardamos en la variable “id”. En este caso solo se nos envió el “id” del registro que se quiere eliminar. En el paso tres solo hacemos el query para eliminar el registro. En el paso cuatro mandamos como respuesta un mensaje de éxito y si ocurrió un error se manda el error como respuesta. Si intentamos eliminar un registro notaremos que esta vez también fue borrado de nuestra base de datos. Y esta sería la respuesta del servidor:
{"success":true,"msg":"Contact deleted successfully"}Con esto terminamos la última parte de nuestro CRUD que es eliminar un registro.
Conclusión
En esta ocasión vimos como podemos crear, leer, actualizar y eliminar datos usando “HttpProxy”, “JsonReader”, “JsonWriter” y un “Store” esto es muy útil ya que por medio de estas cleses de Extjs no tenemos que hacer las peticiones al servidor manualmente como lo hemos hecho en tutoriales pasados. El “JsonReader” se encarga de leer la información que nos manda el servidor, mientras el “JsonWriter” codifica la información y hace la petición al servidor. Si tienes algún comentario o sugerencia no dudes en comunicarnolos viá el formulario inferior, por el foro o en alguna de las redes sociales como Twitter y Facebook.Te gustaría recibir más tutoriales como este en tu correo?
Este tutorial pertenece al curso Aprendiendo Ext JS 3, te recomiendo revises el resto de los tutoriales ya que están en secuencia de menor a mayor complejidad.
Si deseas recibir más tutoriales como este en tu correo te recomiendo registrarte al curso, si ya eres miembro solo identifícate y registrate al curso, si no eres miembro te puedes registrar gratuitamente!
Si no gustas registrarte en este momento no es necesario! Aún así puedes recibir los nuevos tutoriales en tu correo! Jamás te enviaremos Spam y puedes cancelar tu suscripción en cualquier momento.
Regístrate a este curso
Este tutorial pertenece al curso Aprendiendo Ext JS 3, revisa todos los tutoriales que tenemos en este mismo curso ya que están en secuencia y van de lo más sencillo a lo más complicado.
Tendrás acceso a descargar los videos, códigos y material adicional.
Podrás resolver los ejercicios incluidos en el curso así como los Quizzes.
Llevarás un registro de tu avance.
91Comentarios
Gracias Victor Felipe!!!
Muy bueno y muy bien explicado. Estaría genial un tutorial más "ampliado" donde el CRUD no se haga sobre la grilla, sino sobre un formulario, ya que en muchas aplicaciones del mundo real se presenta información resumida sobre la grilla, pero la información guardada en la base es mayor.
Felicidades equipo de quizzpot, esta muy bien este ejemplo me ayudo mucho para reafirmar mis conocimientos, hice un CRUD pero utilizando extjs, java y oracle
Saludos: Estoy empezando a aprender la infraestructura Ext, ExtJs. Algo que me deja indeciso sobre su aprendizaje, es el aspecto de la integración con frameworks PHP. Mi esquema mental me indica: * Ext, ExtJs -- Lado del cliente. * PHP -- Lado servidor. Pero resulta que esta separación se está volviendo difusa. Concretamente, estoy aprendiendo la infraestructura Yii. Con ella, puedo "de un solo golpe", crear la interface para las operaciones CRUD (entre otras cosas) y el soporte PHP necesario para ello. Pero la interfáz y usabilidad de ExtJS me invita a usar sus componentes, sin embargo al precio de programar el CRUD. Entonces pregunto, en el caso de Yii en particular y el de los "frameworks" PHP, ¿cuál es el camino que me aconsejan?
Suena bien! gracias por las ideas, la tomaremos en cuenta. Saludos
Que bien! usaste algún framework java? spring, struts, etc.? o lo hiciste con un servlet?
Mira, el problema que veo con ese tipo de herramientas es que si en algún momento necesitas hacer alguna modificación o personalizar el componente te puedes meter en problemas, ademas de que normalmente no tienen todos los plugins y extensiones que te encuentras cuando trabajas con JS. Personalmente prefiero usar JavaScript directamente por la flexibilidad y dinamismo del lenguaje,a demás de que tienes el poder de modificar los componentes a tu antojo y de una manera sencilla. Saludos
y para hacer un borrado de varios items en un solo envio ? al borrar realiza un post para borrar por cada item seleccionado
Oye Crys: Pero se supone que un buen "framework" debe ser (relativamente) fácilmente extensible o interactuar con otros, el mejor ejemplo es el modelo OSI que nos permite el internet (entr otras cosas). Aquí también estamos hablando de diferentes capas ("tiers"), pero en fín. Por lo menos hay que notar este aspecto en estos "frameworks" que se vuelven "individualistas" y poco cooperativos. De cualquier forma, investigué y dí con el "Zefext Framework" (http://zefext.sourceforge.net/), para el Zend framework. Creo que hay que divulgar y apoyar estos esfuerzos también, porque queremos "frameworks" cooperativos que aprovechen lo mejor de distintos proyectos. !! Gracias por tu apoyo/ayuda hermano ¡¡
hola me parece muy completo este tutorial para los que somos principiantes. Pero tengo una duda... cuando intento hacer el update y el delete con el grill no lo hace y ya cheque lo del id pero no le entiendo mucho je podrian decir a que se debe, la verdad es que no se nada de extjs pero me gustaria aprender y tambien quisiera saber si se puede utilizar con ajax para que me aparesca el grill en un DIV espcifico??
Para que aparezca en un DIV específico debes definir la configuración "renderTo" que le darías el ID del DIV donde quieres que se muestre. Saludos
seria estupendo si le agregas un paginador!! gracias por tu aporte
Holas, me gustaría saber como manejar la ultima parte que creo quedó inconclusa, ¿como puedo yo sacar en una caja de texto el mensaje que dice Contact deleted successfully ? Salu2
Hola!, excelente el tuto!. Ahora como estoy dando mis primeros pasos en php quisiera saber que línea de código y dónde debo agregar para insertarle una imagen (upload image) en una carpeta especifica para luego poder buscarla editar ó borrarla también. GRacias y disculpen mi ignorancia ...
Saludos. Muy buen tutorial espero poder aplicarlo bien mi pregunta es que si tambien funcionaria para otros componentes que no sea solo grids. Estoy desarrollando con php y voy a aplicar php reflection con este esquema CRUD. Gracias.
Hola esta muy bueno pero me dado cuenta que cuando la grilla tiene muchos registros, ya no se pueden ver los ultimos de la fila
Hola, me estoy iniciando en ExtJS y mi pregunta es la siguiente: ¿Cómo puedo controlar el UPDATE de la celda? O sea, al modificar la celda no quiero que actualice por defecto, quiero que preguntar "Está seguro que desea actualizar". Lo mismo con la creación del contacto, quiero preguntar primero y en dependencia (Si ó No) ejecuto "createContact.php". ¿Se puede hacer eso? Gracias de antemano
Hola a todos, me estoy iniciando en ExtJS. Mi pregunta es la siguiente ¿Existe forma de controlar las llamadas a read/create/update/destroy? Me explico: 1-Quiero que antes de insertar un registro nuevo salga la pregunta de confirmación "¿Creará un nuevo registro?" 2-Si borro el registro que me pregunten antes de borrarlo. 3-Si ACTUALIZO un registro quiero que confirmen si cancelo o continuo con el update. y así por estilo. Sucede que si modifico automáticamente actualiza la base de datos y no quiero esto, etc. Gracias
Buen post, una consulta: por lo general yo centralizo las llamadas a mi base de datos mediante un controlador digamos controlador.php, en la cual defino mediante un switch la operacion(guardar, modificar, etc): $operacion = $_POST['operacion']; switch($operacion){ 'guardar': $objeto->guardar; 'modificar': $objeto->modificar; ... } lo que necesito es saber es como enviar un parametro adicional (operacion) desde mi proxy para que mi controlador sepa que operacion realizar?. Muchas Gracias.
hola pues ya le di muchas vueltas al asunto y no mas no me sale bien esto, cuando trato de editar un elemento del grid si me deja pero por default aparece y lo tengo q borrar para anotar algo si no pues se queda todo por default, segun yo esta bien mi código
Hola como estan? Necesito por favor ayuda! Necesito saber si a este proyecto se le puede agregar una funcion por ejemplo de sacar un promedio o algo asi. Muy agradecida por este tutorial y mas lo estaria si pudieran responderme... Desde ya gracias...
Chequeen este sitio, http://pogextjs.comyr.com/pog_extjs permite hacer tanto la interfaz (con ExtJS), la logica del servidor (Php) y la base de datos (MySQl), simplemente siguiendo un asistente creas un formulario listo para agregar, modificar y eliminar datos de la base de datos, y una vez con el archivo .js lo personalizas a tu manera. Saludos
holaa gracias por el tutorial pero tengo un problema con la parte de la funcion de addContacts cuando corro el ejemplo en el servidor local no hay problema funciona pero cuando intento suvirlo a un servidor web no aparece el grid en netebeans me señala que hay error en la misma funcion
Hola se que ya paso mucho tiempo pero yo tengo 3 consultas: la primera como puedo modificar para decirle cuando llamar a destroy,add,delete etc desde un boton para hacerlo por ejemplo por varias filas seleccionadas eliminar o modificar. la segunda se puede modificar para que lance mensajes de confirmacion con esta de usar las funciones api por ejemplo desea eliminar los registros seleccionados. y la tercera que pasa si en la parte superior hay otros campos y el grid es un detalle como le paso unos de los campos del formulario como un parametro mas. saludos José
Hola, muy buen tutorial, claro y preciso, intente crear una nueva columna para insertar otro dato pero no la esta guardando que debo hacer para que la grabe en la DB?
Ya verifique mi error, gracías por el tuto nuevamente...
quiero agregarle paginacion me aparece el page pero me muestra todos init: function(){ var store = new Ext.data.JsonStore({ url: 'paging.php', root: 'data', totalProperty: 'total', fields: ['city','visits','pageVisits','averageTime'], baseParams: {x:10,y:20} }); store.load({params:{z:30,start:0,limit:5}}); var pager = new Ext.PagingToolbar({ store: store, // <--adding the pagingtoolbar to the grid border: false, stripeRows: true }); que estoy haciendo mal? slds y gracias
ya lo solucione!!! gracias
???????? ??? ???????? ? ??? ??? ??????? ??????? ????????? ??? ???????? ????????. ???????????? ??????????? ????? ?????? ?? ?????????? ?????? ???? ??????? ?? ?????? ?? ??????????? ???????? ? ???? ?? 15.10.2019.. ? ?????? ????????? ??? ?????? ? ??????? ????? ???????????!??????? ?? ????????: https://google.com
?????????? ??? ? ??? ??? ??????? ??????? ????????? ??? ???????? ????????. ???????????? ??????????? ????? ?????? ?????????? ??????????? ? ????????????? ????? ?? ?????? ?? ??????????? ???????? ????????? ??????? ? ???? ?? 15.10.2019.. ? ?????? ????????? ??? ?????? ? ??????? ????? ???????????!??????? ?? ????????: https://google.com
??????? ??? ?? ???????? ?? ???????? ??????? ????????? ??? ???????? ????????. ??????????? ????? ?????? ?????????? ???????? ?????? ?????? ?? ?????? ?? ??????? ???????? ?????? ??????? ? ???? ?? 15.10.2019. ???? ??? ?????? ? ??????? ?? ???????????!??????? ?? ????????: https://google.com
? ? ? ? ? ? ? ? ? ? ? , ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : www.bit.ly/goneeCet
?????????? ??? ? ??? ??? ??????? ??????? ????????? ??? ???????? ????????. ??????????? ????? ?????? ?????????? ???????? ?????? ????? ?? ?????? ?? ??????????? ???????? ??????? ? ??????? 5 ?????. ?? ?????????? ????!??????? ?? ????????: http://tinyurl.com/goneeCet
???????????! ??? ????? email ?????? ???????????. ?????? ???????? ???? ???: www.tinyurl.com/goneeCet
?????? ??? ? ??????????? ? ??? ??? ??????? ??????? ????????? ??? ???????? ????????. ????????????? ??????????? ???????? ?????? ????? ?? ?????? ?? ??????? ???????? ??????? ? ???? ?? 2 ????. ? ?????? ????????? ??? ?????? ? ??????? ????? ??????????!??????? ?? ????????: www.tinyurl.com/goneeCet
??? ??????????? www.tinyurl.com/goneeCet
???????? ??? ???????? ?? ????????? ?????? ??? ????? ?????. ????????????? ??????????? ?????? ???? ?????? ?? ???????? ???????? ??????? ? ??????? 5 ?????.?? ?????????? ??????! ???? ??? ?????? ? ??????? ?? ????????????!??????? ?? ????????:
? ? ? ? ? ? ? ? ? o ? e p e ? ? ? ? ? ? ? ? ? . ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : www.tinyurl.com/goneeCet
???????? ??? ?? ????????? ?????? ??? ????? ?????. ??????????? ??????????? ?????? ???? ?????? ?? ???????? ???????? ????? ? ??????? 30 ?????.?? ???????? ?????? ???? ??? ?????? ? ??????? ?? ????????????!??????? ?? ????????: www.tinyurl.com/goneeCet
?????????? ???????? ??? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ?????????? ???????? ?????? ??????? ?? ???????? ???????? ????????? ??????? ? ??????? 5 ?????.?? ???????? ?????? . ? ?????? ????????? ??? ?????? ? ??????? ????? ???????????!????? ? ???????: www.tinyurl.com/goneeCet
?????? ??? ? ??????????? ?? ????????? ?????? ??? ????? ?????. ????????????? ?????????? ???????? ?????? ??????? ?? ??????? ???????? ????? ? ??????? 30 ?????.?? ???????? ?????? . ? ?????? ????????? ??? ?????? ? ??????? ????? ????????????!????? ? ???????: http://na.to/Bare
???????? ??? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ????! ??? ??????????? ??????????? ? ????????????? ?????? ?? ??????????? ???????? ????? ? ??????? 30 ?????.?? ???????? ?????? . ? ?????? ????????? ??? ?????? ? ??????? ????? ????????????!??????? ?? ????????: https://google.com
? ? ? ? ? ? ? ? ? o ? e p e ? ? ? ? ? ? ? ? ? . ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : http://tinyurl.com/goneeCet
? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? . ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : www.tinyurl.com/goneeCet
? ? ? ? ? ? ? ? ? o ? e p e ? ? ? ? ? ? ? ? ? . ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : https://bit.ly/goneeCet
??? ????????? ???? ????? ????????? ?? ??????. ??????? ? ?????????: http://tinyurl.com/goneeCet
???????? ??? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ?????????? ?????? ???? ????? ?? ??????????? ???????? ????????? ??????? ? ?????? ?? 2 ????.?? ?????????? ??????! . ? ?????? ????????? ??? ?????? ? ??????? ????? ????????????!??????? ?? ????????: http://tinyurl.com/goneeCet
?????????? ??? ?????? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ????????????? ?????? ?? ???????? ?????? ??????? ?? ??????? ???????? ? ??????? 5 ?????.?? ?????????? ??????! ???? ??? ?????? ? ??????? ?? ???????????!????? ? ???????: http://tinyurl.com/goneeCet
??? email ?????? ???????? ? ????????? ?? ??? ????? ?????! ????????? ???: http://tinyurl.com/goneeCet
Ba? ??????????? Tyt www.tinyurl.com/goneeCet
?????????? ???????? ??? ?? ????????? ?????? ??? ????? ?????. ??????????? ????! ?? ?????????? ???????? ?????? ????? ?? ??????????? ???????? ????????? ??????? ? ?????? ?? 2 ????.?? ?????????? ??????! ???? ??? ?????? ? ??????? ?? ???????????!??????? ?? ????????: https://tinyurl.com/goneeCet
?????? ??? ? ??????????? ?? ????????? ?????? ??? ????? ?????. ??????????? ????! ?????????? ???????? ?????? ?????? ?? ??????????? ???????? ?????????? ??????? ? ??????? 30 ?????.?? ?????????? ??????! ???? ??? ?????? ? ??????? ?? ???????????!????? ? ???????: http://new.so/Bare
???????? ??? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ????????????? ?? ?????????? ?????? ???? ??????? ?? ??????? ???????? ?????? ??????? ? ?????? ?? 2 ????.?? ?????????? ??????! . ? ?????? ????????? ??? ?????? ? ??????? ????? ????????????!??????? ?? ????????: http://new.so/Bare
????? ??? ?o?epe???? ?????. ?????? ??? ?????????? ???????! ??????? ? ????????? ?????? ??????: https://tinyurl.com/goneeCet
?????????? ??? ?????? ?? ????????? ?????? ??? ????? ?????. ??????????? ????! ?? ?????????? ???????? ?????? ?????? ?? ??????? ???????? ????????? ??????? ? ?????? ?? 2 ????.?? ?????????? ??????! ???? ??? ?????? ? ??????? ?? ????????????!????? ? ???????: http://tinyurl.com/goneeCet
??? ????????? ???? ????????????? ????????? ?? ?????. ??????? ? ?????????: https://tinyurl.com/goneeCet
?????? ????. ??? ?????????? ?????????? ?????! ?????? ??? ?????????? ???????! ??????? ?????: https://tinyurl.com/goneeCet
??? ????? email ??????? ? ?? ????????? ???? ??????? ???????? ?????! ?????????? ? ????????: www.tinyurl.com/goneeCet NMVVquizzpot.comRKKF
? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : www.tinyurl.com/goneeCet NMVVquizzpot.comRKKF
???????? ??? ?? ????????? ?????? ??? ????? ?????. ??????????? ?????? ?????????? ???????? ?????? ????? ?? ??????????? ???????? ? ??????? 5 ?????.?? ???????? ?????? . ? ?????? ????????? ??? ?????? ? ??????? ????? ???????????!????? ? ???????: https://tinyurl.com/goneeCet NMVVquizzpot.comRKKF
?????????? ??? ?????? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ????! ?????????? ???????? ?????? ?????? ?? ??????? ???????? ?????????? ??????? ? ??????? 30 ?????.?? ?????????? ??????! . ? ?????? ????????? ??? ?????? ? ??????? ????? ???????????!????? ? ???????: https://tinyurl.com/goneeCet NMVVquizzpot.comRKKF
??????? ????????????! ?????? ???????? ??????????? ?????????? ??? ? ????????????? ?????????? ???? ??????????? ?? 16000 ?? 200 ?.?. ??????????? ?? ?????? 2 ???? ?? ?? ????? ??????? http://tinyurl.com/goneeCet NMVVquizzpot.comRKKF
??????? ????????????! ?????? ??????? ????????? ?????????? ??? ? ????????????? ?????????? ???? ??????????? ?? 14000 ?? 280 ?.?. ??????????? ?? ?????? 4 ???? ?? ?? ????? ??????? http://tinyurl.com/goneeCet NMVVquizzpot.comRKKF
????????? ??????! ?????? ??????? ??????????? ?????????? ??? ? ????????????? ?????????? ???? ??????????? ?? 20000 ?? 250 ?.?. ??????? ?? ?????? 4 ???? ?? ?? ???????? ??????? http://tinyurl.com/goneeCet NMVVquizzpot.comRKKF
? ? ? ? ? ? ? ? ? o ? e p e ? ? ? ? ? ? ? ? ? . ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : www.tinyurl.com/goneeCet NMVVquizzpot.comRKKF
? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? : www.tinyurl.com/goneeCet NMVVquizzpot.comRKKF
?????? ????, ? ??? ??????? ?????????? ?????? ?0C?oT0! ??????? ? ?????????: https://tinyurl.com/goneeCet NMVVquizzpot.comRKKF
??? ??????? 160701 ???. https://tinyurl.com/goneeCet NMVVquizzpot.comRKKF
JUYEGRTmessage_quizzpot.comJUYEGRT
??? ??????? 155395 ?. https://tinyurl.com/goneeCet NMVV47722RKKF
?????? ??? ? ??????????? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ?? ?????????? ???????? ?????? ?????? ?? ???????? ???????? ?????????? ??????? ? ??????? 5 ?????.?? ???????? ?????? . ? ?????? ????????? ??? ?????? ? ??????? ????? ????????????!??????? ?? ????????: https://tinyurl.com/goneeCet NMVV47722RKKF
??? ??????? 142567 ???. https://bit.ly/goneeCet SVWVE230119THRT
BAM nEPEBOD 150131 py6. www.tinyurl.com/goneeCet JUYEGRT47722NFDAW
??? ??????? 109376 ?. https://tinyurl.com/goneeCet MTGJNF230119SVWVE
??? ??????? 183224 ???. https://tinyurl.com/goneeCet NMVV56050RKKF
??? ??????? 110932 ?. https://tinyurl.com/goneeCet NMVV56050RKKF
??? ??????? 172366 ???. http://anytraffic.ru/goneeCet NMVV56050RKKF
?????? ???????? ???? ???? ???????? ????. ?????? ?? ??????: https://tinyurl.com/goneeCet JUYEGRT14784JUYGTD
??? ??????? 167827 ?. https://tinyurl.com/goneeCet NFDAW14784JUYEGRT
?????????? ???????? ??? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ??? ??????????? ??????????? ? ????????????? ??????? ?? ???????? ???????? ?????? ??????? ? ?????? ?? 2 ????.?? ???????? ?????? ???? ??? ?????? ? ??????? ?? ???????????!??????? ?? ????????: https://forms.yandex.ru/u/5ece8e4ff2bfeb4570goneeCet NMVVquizzpot.comRKKF
?????? ???? XCNTCE45054XCNTCE
???????????! ??? ????? email ?????? ???????????. ?????? ???????? ???? ???: www.tinyurl.com/A54z2zgZ QIEYNC45054LWFUED
Bauu email BbI6paH cJIy4auHo u noJIy4aete ot Hac cynep 6oHyc! nogpo6Hee tyt www.tinyurl.com/168Z4z-i ZOQAZQ45054UQSZMT
???????????! ??? ????? email ?????? ???????????. ?????? ???????? ???? ???: www.tinyurl.com/5994-407 MOARTG45054QIEYNC
Leonarddug
Leonarddug
?????????? ???????? ??? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ????! ??????? ?????? ???? ??????? ?? ???????? ???????? ????????? ??????? ? ??????? 5 ?????.?? ???????? ?????? ???? ??? ?????? ? ??????? ?? ????????????!????? ? ???????: https://tinyurl.com/goneeCet NMVV190845RKKF
??????????? ??? ? ??? ??? ?????? ??????? ?????????? ??? ????? ?????. ??????????? ?????????? ???????? ?????? ????? ?? ??????????? ???????? ????? ? ?????? ?? 2 ????.?? ?????????? ??????! . ? ?????? ????????? ??? ?????? ? ??????? ????? ????????????!??????? ?? ????????: https://google.com/goneeCet NMVV190845RKKF
?????????????? ????????????! ?????? ??????? ????????? ?????????? ??? ? ????????????? ??????? ??????????? ?? 19000 ?? 230 ?.?. ??????????? ?? ?????? 4 ???? ?? ?? ????? ??????? https://tinyurl.com/goneeCet NMVV190845RKKF
??? ??????? 126170 ???. https://tinyurl.com/goneeCet NMVV45054RKKF
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ! ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : www.tinyurl.com/goneeCet NFDAW52688NFDAW