> In my case, I have several forms with e.g. 10-15 fields, so this adds up and 
> in the end the templates are quite complex. If there were some shortcut or 
> macro which generates the above HTML-code, it would be a lot easier, perhaps 
> there's a decent solution? If it would looke something like this, it would be 
> much easier to manage:
>
> <span tal:content="view/widgets/foo/gen_html />
>   
Isn't tal:repeat enough?? Something like:

<tal:block tal:repeat="widget view/widgets">
  <div class="label">

    <label for="field.name" title="The widget's hint"
        tal:attributes="for widget; title widget/hint"
        tal:content="widget/label">Label</label>
  </div>
  <div tal:condition="widget/error"
    tal:content="structure widget/error">Error</div>
  <div class="field">
      <input tal:replace="structure widget" />
  </div>
</tal:block>

If you need specific widgets order then you may use:

form.FormFields(interfaces.ISomeInterface).select('field1', 'field2',....)


Another possibility io define function in your view class like:

widgetTempl = ViewPageTemplateFile('widgetsection.pt')
def genWidgetHtml(self, widget):
     return self.widgetTempl(widget=widget)

and create file widgetsection.pt with content like:

<tal:block tal:define="widget python: options.get('widget', None)">
  <div class="label">

    <label for="field.name" title="The widget's hint"
        tal:attributes="for widget; title widget/hint"
        tal:content="widget/label">Label</label>
  </div>
  <div tal:condition="widget/error"
    tal:content="structure widget/error">Error</div>
  <div class="field">
      <input tal:replace="structure widget" />
  </div>
</tal:block>


Then in your pageform.pt just call for every widget something like:

<div tal:replace="python: view.getWidgetHtml(view.widgets['foo']" />


Above code is from head so may be buggy or incomplete.

-- 
Maciej Wisniowski

_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to