Here is it. Small, nice, tested and documented.
One downside though. I tried hard but failed to understand the original
self.trows purpose. While I preserved default functionality, I'm not
sure if I missed something subtle.
And, btw, use of trows seemed buggy for me.
Here is my best guess:
trows is intended to remove validation errors from widgets that were
manually assigned to the database fields. If so - then it fails it's
purpose because
self.trows[fieldname][1][0].components
addresses components of the <INPUT/> and not of <TD/>. To fix it you
need to remove [0]:
self.trows[fieldname][1].components
On Tue, May 19, 2009 at 7:52 AM, Alexey Nezhdanov <[email protected]> wrote:
> Hello.
>
> Reading the SQLFORM sources doesn't give me any insight on
> how to do custom form layout w/o modifying web2py source
> AND writing extensive wrappers around it.
>
> I found these pages while googling:
> http://groups.google.com/group/web2py/browse_thread/thread/39c0bd5e01860eb/fecc0f6edbb3885f?lnk=gst&q=custom+sqlform+layout#fecc0f6edbb3885f
> http://www.wellbehavedsystems.co.uk/web2py/examples/custom_forms.html
>
> As I can see - it was an unofficial solution, proposed about a
> half-year ago. Is it a recommended approach atm? If not - is
> there one? If yes - is it going to be included?
>
> I am personally didn't like it too much - it's what I referred to
> as 'extensive wrapper'.
>
> If there is no support in current SQLFORM yet I'll probably end
> up writing something myself, hopefully something simpler.
>
> Currently I think of something like this (in SQLFORM.__init__):
> 1) iterate over fields, generate widgets (it does that already),
> 2) put generated widgets into a Storage(input_name:input_widget)
> 3)
> self.components=[]
> self.do_custom_layout() # by default does nothing, can be redefined in
> derived clases
> self.do_standard_layout() # populates table with fields remaining in the
> Storage fields
>
> do_custom_layout (when redefined) will pop widgets out of
> said Storage and put them into some HTML, adding it to self.components
>
> --
> Sincerely yours
> Alexey Nezhdanov
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---
--- /tmp/sqlhtml.py 2009-05-03 15:47:51.000000000 +0400
+++ sqlhtml.py 2009-05-19 11:36:30.021600012 +0400
@@ -389,8 +389,14 @@
continue
else:
inp = self.widgets.string.widget(field, default)
- tr = self.trows[fieldname] = TR(label, inp, comment,
- _id=row_id)
+ self.trows[fieldname] = dict(label=label, widget=inp,
+ comment=comment, _id=row_id)
+ self.custom_layout()
+ for fieldname in self.fields:
+ try: trow=self.trows[fieldname]
+ except KeyError: continue
+ tr=TR(trow['label'], trow['widget'], trow['comment'],
+ _id=trow['_id'])
xfields.append(tr)
self.custom.dspval[fieldname]=dspval or nbsp
self.custom.inpval[fieldname]=inpval or ''
@@ -425,7 +431,16 @@
if not self['hidden']:
self['hidden'] = {}
self['hidden']['id'] = record['id']
- self.components = [TABLE(*xfields)]
+ self.components += [TABLE(*xfields)]
+
+ def custom_layout(self):
+ """ Must pop custom items out of self.trows dictionary
+ and populate self.components list with html elements.
+ For instance it may do:
+ name=self.trows.pop('name')
+ tr=TR(name['label'],name['widget'],name['comment'],_id=name['_id'])
+ self.components.append(TABLE(tr))
+ """
def accepts(
self,
@@ -485,8 +500,9 @@
for fieldname in self.fields:
field = self.table[fieldname]
if hasattr(field, 'widget') and field.widget\
+ and self.trows.has_key(fieldname)\
and request_vars.has_key(fieldname):
- self.trows[fieldname][1][0].components = \
+ self.trows[fieldname]['widget'].components = \
[field.widget(field, request_vars[fieldname])]
return ret