Vamos a tratar de comentar los comentarios. Tendremos muchos comentarios padres y cada comentario padre tendrá muchos subcomentarios hijos. Cuando se crea un comentario padre automáticamente se crea un formulario para los subcomentarios, cada hijo sabrá quien es su padre y todo esto ocurrirá en una misma página (algo parecido a lo que hace el facebook).
Este ejemplo funciona satisfactoriamente gracias a la cooperación de Alan Etkin:
en el modelo..........................................
db.define_table('comment',
Field('body',label='Comentario'))
db.define_table('comment2',
Field('body',label='Comentario'),
Field('idcomentario',db.comment))
db.comment.body.requires=IS_NOT_EMPTY()
db.comment2.body.requires=IS_NOT_EMPTY()
db.comment2.idcomentario.writable = db.comment2.idcomentario.readable = False
en la controladora........................................
def index():
form = SQLFORM(db.comment,fields=['body'])
if form.accepts(request.vars,session):
response.flash='su comentario ha sido posteado'
lista = db(db.comment.id>0).select(orderby = ~db.comment.id)
return dict(form=form,lista=lista)
def post():
id1=request.args[0]
comentario=db(db.comment.id==request.args[0]).select()[0]
form = SQLFORM(db.comment2,fields=['body'])
form.vars.idcomentario=comentario.id
if form.accepts(request.vars,session):
response.flash='su comentario ha sido posteado'
elif request.post_vars.has_key('body'): # Alan Etkin aporte
if len(request.post_vars['body']) >0:
response.flash='su comentario ha sido posteado'
db.comment2.insert(body = request.post_vars['body'],idcomentario = id1)
comments=db(db.comment2.idcomentario==comentario.id).select()
return dict(form=form,comments=comments)
en la vista.....................................................
default/index.html
{{extend 'layout.html'}}
<h2>Postea un comentario:</h2>
<div>
{{=form}}
</div>
{{if len(lista):}}
{{for elem in lista:}}
<h3>{{=elem.body}}</h3>
<div>{{=LOAD('default','post.load',args=[elem.id],ajax=True)}}</div>
{{pass}}
{{else:}}
<h2>No hay comentarios</h2>
{{pass}}
default/post.load // fijaos que la terminacion es (.load) no (.html) y tampoco se le pone {{extend 'layout.html'}}
{{if len(comments):}}
{{for comment in comments:}}
<h5>{{=comment.body}}</h5>
{{pass}}
{{else:}}
{{pass}}
{{=form}}
No hay comentarios:
Publicar un comentario