actualizar datos desde iframe modal

165 views
Skip to first unread message

Enrique Zuñiga Perez

unread,
Apr 23, 2014, 7:14:37 PM4/23/14
to web2py-...@googlegroups.com
Buen dia les pido su ayuda necesito hacer una especie de mantenimiento de data (agregar, modificar y eliminar) 
basicamente me gustaria que me ayuden con el actualizar la data de la lista (modificar) que me serviría para el resto
a continuacion les explico como funciona

##************************
## Tabla Producto       
##************************
db.define_table('producto', 
          Field('idproducto','string',length=3, label='Código de Producto', required=True ), 
          Field('nombre_producto','string',length=30, required=True, requires=IS_NOT_EMPTY(error_message='Ingrese un producto') ),
          Field('unidad_produccion','string',length=15, required=True, requires=IS_NOT_EMPTY(error_message='Ingrese la unidad de producción para el producto')),  
          Field('detalle_producto','text'),
          Field('estado','boolean'),
          primarykey=['idproducto'])

En el archivo default.py de mi controlador tengo: 
#######################################################
#              NUEVO PRODUCTO                                               #
######################################################
def nuevo_producto():
    form = SQLFORM(db.producto,submit_button='Registrar', fields = ['nombre_producto','unidad_produccion','detalle_producto'],formstyle='table2cols')
    #para generar el idproducto
    num=db(db.producto.idproducto > 0).count()
    if num<=9:
      form.vars.idproducto="p0"+str(num+1)
    else:     
      form.vars.idproducto="p"+str(num+1)
    #para que el campo estado de la tabla producto se marque verdadero
    form.vars.estado=True
   #mensajes de validacion
    if form.accepts(request.vars, session):
       response.flash = 'Producto Registrado'
       
    elif form.errors:
       response.flash = 'No se pudo registrar el producto'
    else:
       response.flash = 'Por favor rellene el formulario'
    return dict(form=form)
    
#######################################################
#              ACTUALIZA PRODUCTO                                          #
######################################################
def productos_update():
    cod_producto=request.args (0) #paso un parametro desde la vista donde se listan los productos
    record = db(db.producto.idproducto==cod_producto).select().first() 
    form_update = SQLFORM(db.producto,record,submit_button='Actualizar',showid=False,hidden=dict(idproducto=cod_producto), fields = ['nombre_producto','unidad_produccion','detalle_producto'],formstyle='table2cols',buttons = [TAG.button('Actualizar',_type="submit", _onClick ="parent.$.fn.colorbox.close();")])
    if form_update.accepts(request.vars, session):
       #redirect(URL('productos'),client_side=True) 
       response.flash = 'Se actualizo los datos'
       
    elif form_update.errors:
       response.flash = 'No se pudo actualizar los datos'
    else:
       response.flash = ''
  
    return dict(form_update=form_update)

Estoy usando el colorbox para los modales 
la vista de este controlador es y funciona bien  :

views/default/productos_update.html

{{extend 'layout.html'}}
<h3>Actualizar Productos</h3>
<hr>
{{=form_update}}


































Tengo tb en el controlador la funcion productos que me lista los productos y sus caracteristicas 

#######################################################
#              LISTAR PRODUCTOS                       #
###################################################### 

def productos():
    lista_productos=db().select(db.producto.ALL,orderby=db.producto.nombre_producto ,distinct=True)
    
     return dict(lista_productos=lista_productos)


en la vista llamo tanto a la lista_productos y en un modal iframe al Actualizar productos

GESAPI/views/default/productos.html

{{extend 'layout.html'}}
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset='utf-8'/>
<title>Productos Apicolas</title>
<style>
body{font:12px/1.2 helvetica, sans-serif; padding:0 10px;}
a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
h2{font-size:13px; margin:15px 0 0 0;}
</style>
<link href="{{=URL('static','modal/colorbox.css')}}" type="text/css" rel="stylesheet"/>
        <script src="{{=URL('static','modal/js/jquery.min.js')}}"></script>
        <script src="{{=URL('static','modal/js/jquery.colorbox.js')}}"></script>
<script>
$(document).ready(function(){
//Examples of how to assign the Colorbox event to elements
                $(".inline").colorbox({inline:true, width:"27%", height:"70%"});
                $(".iframe").colorbox({iframe:true, width:"27%", height:"70%", opacity:"0"});
});
</script> 
        

</head>
<body>
            <div id="datos">
                       
                {{for rec in lista_productos:}}
                    <label>Producto </label>{{=rec.nombre_producto}} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    <label>Unidad de Produccion </label>{{=rec.unidad_produccion}} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    <label>Detalle </label>{{=rec.detalle_producto}} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    <ul>

                       {{= LI (A ("Actualizar", _href = URL ('default', 'productos_update', args =rec.idproducto), _class='iframe' ))}} <!-- llamo a productos_update mediante un iframe modal -->
              
                       
                    </ul>
                    --------------------------------------------------------------------------------------------------------------------------------
                    <br/>
            
                {{pass}}

                         
        </div>
      
</body>
</html>

y queda como se muestra(por ahora no me preocupe la estetica, eso lo hare mas adelante)


Al pulsar actualizar habre el modal y muestra el formulario como se muestra

Al dar click en Actualizar, la data se actualizar en la bd mas no se ve reflehado en el listado, es decir tengo que actualizar el navegador para que se actualizar la data
COMO PUEDO HACER ?

ALGUIEN QUE ME DE UNA SOLUCION PORQUE ES PROYECTO DE TESIS 


samuel bonill

unread,
Apr 23, 2014, 8:23:38 PM4/23/14
to web2py-...@googlegroups.com
Si usaras angular sera mas sencillo, pero la solución que planteo es la siguiente, cuando actualizas un registro la función  "productos_update" debería llamar a otra por ejemplo ajax_update que inserte
código javascript remplazando los valores actualizados con el registro asociado sin recargar la pagina, una solución podría ser :

Las lineas que estan en azul claro es lo nuevo que tienes que agregar tanto a la vista y crear el controlador ajax_update...

en la vista que tienes seria algo como:


<div id="datos">
                       
                {{for rec in lista_productos:}}
                    <div id="registro_numero{{=rec.idproducto}}">
                    <label>Producto </label>{{=rec.nombre_producto}} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    <label>Unidad de Produccion </label>{{=rec.unidad_produccion}} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    <label>Detalle </label>{{=rec.detalle_producto}} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    </div>
                    <ul>
                       {{= LI (A ("Actualizar", _href = URL ('default', 'productos_update', args =rec.idproducto), _class='iframe' ))}} <!-- llamo a productos_update mediante un iframe modal -->
           
                     </ul>
                    --------------------------------------------------------------------------------------------------------------------------------
                   <br/>
        
                {{pass}}
</div>

Luego en la función  "productos_update":



def productos_update():
    cod_producto=request.args (0) #paso un parametro desde la vista donde se listan los productos
    record = db(db.producto.idproducto==cod_producto).select().first() 
    form_update = SQLFORM(db.producto,record,submit_button='Actualizar',showid=False,hidden=dict(idproducto=cod_producto), fields = ['nombre_producto','unidad_produccion','detalle_producto'],formstyle='table2cols',buttons = [TAG.button('Actualizar',_type="submit", _onClick ="parent.$.fn.colorbox.close();")])
    if form_update.accepts(request.vars, session):
       #redirect(URL('productos'),client_side=True)
       ajax_update(form_update)
       response.flash = 'Se actualizo los datos'
       
    elif form_update.errors:
       response.flash = 'No se pudo actualizar los datos'
    else:
       response.flash = ''
  
    return dict(form_update=form_update)


#funcion que modifica el html del documento

def ajax_update(form):
     if isinstance(form, SQLFORM):
        # duck_typing solo espera datos específicos de la tabla producto
        id_producto = form.vars.idproducto
     jquery = """ $("#{0}").html("<label>Producto </label>{1} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    <label>Unidad de Produccion </label>{2} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp        
                    <label>Detalle </label>{3} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp"); """
   
    return jquery.format(id_producto, form.vars.nombre_producto, form.vars.unidad_produccion, form.vars.detalle_producto)




espero que te funcione...


--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuari...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

samuel bonill

unread,
Apr 23, 2014, 8:27:42 PM4/23/14
to web2py-...@googlegroups.com
modifica la ultima funncion por :


#funcion que modifica el html del documento

def ajax_update(form):
     if isinstance(form, SQLFORM):
        # duck_typing solo espera datos específicos de la tabla producto
        id_producto = form.vars.idproducto
     jquery = """ $("#registro_numero{0}").html("<label>Producto </label>{1} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
                    <label>Unidad de Produccion </label>{2} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp        
                    <label>Detalle </label>{3} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp"); """
   
    return jquery.format(id_producto, form.vars.nombre_producto, form.vars.unidad_produccion, form.vars.detalle_producto)

faltaba #registro_numero{0}

Enrique Zuñiga Perez

unread,
Apr 24, 2014, 1:18:44 PM4/24/14
to web2py-...@googlegroups.com
Samuel prove el codigo pero no me actualiza 
No entiendo bien lo que hace este codigo 

#funcion que modifica el html del documento

def ajax_update(form):
    
if isinstance(form, SQLFORM):
        # duck_typing solo espera datos específicos de la tabla producto
        id_producto = form.vars.idproducto
     jquery = """ $("#registro_numero{0}").html("<label>Producto </label>{1} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp 

                    <label>Unidad de Produccion </label>{2} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp         
                    <label>Detalle </label>{3} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp"); """
    
    return jquery.format(id_producto, form.vars.nombre_producto, form.vars.unidad_produccion, form.vars.detalle_producto)

no se exactamente lo que devuelve y como es que actualiza la vista donde listo los productos, si no es mucho pedir una explicacion 
muchas gracias

samuel bonill

unread,
Apr 24, 2014, 2:07:07 PM4/24/14
to web2py-...@googlegroups.com
es una función que es llamada por producos_update, recibe un parámetro, ese parámetro es un objeto sqlform, primero valida que en realidad sea instancia de sqlform, luego toma el parámetro y llama sus metodos asociados al formulario que actualizaste por ejemplo
id_producto = form.vars.idproducto,  luego crea una variable llamada jquery que es el texto que va a ser remplazado por los datos actualizados sin recargar la pagina, al final retorna el texto formateado con los valores correspondientes:

ejemplo:

en la cadena de texto {0} seria remplazado por id_producto, {1} por form.vars.nombre_producto y así sucesivamente..

revisa en la consola del navegador para ver si te genera algún error con respecto al código retornado.


Enrique Zuñiga Perez

unread,
Apr 24, 2014, 2:38:45 PM4/24/14
to web2py-...@googlegroups.com
Samuel no esta capturando el valor de d_producto = form.vars.idproducto,  en la funcion de ajax_update 
 las variables actualizadas del form las pude recuperar de: 
def productos_update():
    cod_producto=request.args (0) #paso un parametro desde la vista donde se listan los productos
    record = db(db.producto.idproducto==cod_producto).select().first() 
    form_update = SQLFORM(db.producto,record,submit_button='Actualizar',showid=False,hidden=dict(idproducto=cod_producto), fields = ['nombre_producto','unidad_produccion','detalle_producto'],formstyle='table2cols',buttons = [TAG.button('Actualizar',_type="submit", _onClick ="parent.$.fn.colorbox.close();")])
    if form_update.accepts(request.vars, session): aca me devuelve las variables actualizadas 
       
       ajax_update(form_update)
       response.flash = 'Se actualizo los datos'
       
    elif form_update.errors:
       response.flash = 'No se pudo actualizar los datos'
    else:
       response.flash = ''
  
    return dict(form_update=form_update)

form no me esta pasando nada al ajax_update

Federico Ferraro

unread,
Apr 24, 2014, 2:54:52 PM4/24/14
to web2py-...@googlegroups.com
No estoy seguro , pero talvez puedas hacerlo con el ayudante LOAD ..

Slds ... 


--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a web2py-usuari...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
--
Federico Ferraro
Usuario Linux : 482533.
--

samuel bonill

unread,
Apr 24, 2014, 3:13:37 PM4/24/14
to web2py-...@googlegroups.com
oye tienes razón, eso es lo malo de escribir código sin probar, solo asumí que funcionaria con form_update, mira solo cambia ajax_update(form_update) por ajax_update(request) ...

no tengo tu código para probarlo pero por lógica debe funcionar...

Enrique Zuñiga Perez

unread,
Apr 28, 2014, 12:48:08 PM4/28/14
to web2py-...@googlegroups.com
Samuel ya limpie un  poco el codigo y me queda algo asi: 

def ajax_update(formulario):
     
     #if isinstance(form, SQLFORM):
     # duck_typing solo espera datos específicos de la tabla producto
     #    id_producto = formulario.idproducto

     jquery = """ $("#registro_numero{0}").html("<label>Producto XXXX </label>{1}  &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp 
                    <label>Unidad de Produccion </label>{2} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp         
                    <label>Detalle </label>{3} &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp"); """

     return jquery.format(formulario.idproducto,formulario.nombre_producto, formulario.unidad_produccion, formulario.detalle_producto)

pero no se a donde retorna el jquery ni por que no lo reemplaza a ver si me das una mano 

Enrique Zuñiga Perez

unread,
May 13, 2014, 1:13:03 AM5/13/14
to web2py-...@googlegroups.com
Samuel una consulta , el return de esta funcion donde retorna (valga la redundancia)
def productos_update():
    cod_producto=request.args (0) #paso un parametro desde la vista donde se listan los productos
    record = db(db.producto.idproducto==cod_producto).select().first() 
    form_update = SQLFORM(db.producto,record,submit_button='Actualizar',showid=False,hidden=dict(idproducto=cod_producto), fields = ['nombre_producto','unidad_produccion','detalle_producto'],formstyle='table2cols',buttons = [TAG.button('Actualizar',_type="submit", _onClick ="parent.$.fn.colorbox.close();")])
    if form_update.accepts(request.vars, session):
       #redirect(URL('productos'),client_side=True) 
       ajax_update(form_update)

samuel bonill

unread,
May 13, 2014, 10:32:56 AM5/13/14
to web2py-...@googlegroups.com
en la vista...


--
Reply all
Reply to author
Forward
0 new messages