Bookmark and Share

Custom template in z3c.form

come utilizzare dei template custom per un form costruito utilizzando la libreria z3c.form

by Maurizio Lupo - 2010-06-18

Visto che non ho trovato molta documentazione lascio qui un piccolo esempio pratico di come utilizzare un template custom per una form costruita con z3c.form.

Immaginiamo ad esempio di voler creare un semplice form di ricerca:

Partiamo dalla nostra form con z3c.form:

class ISearchForm(Interface):

    search = schema.TextLine(
             title = _(u"Search"),
             required = True,
             description =u'',
             )

class SearchForm(form.Form):
    fields = field.Fields(ISearchForm)
    ignoreContext = True

    @button.buttonAndHandler(_(u'Search'))
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = _("Error")
            return
        self.results = data

Se non volessimo utilizzare un template custom potremo visualizzare la nostra form usando:

from plone.z3cform.layout import wrap_form 
SearchFormView = wrap_form(SearchForm)

Poi registriamo la nostra vista nel configure.zcml:

   <browser:page
      for="*"
      name="search_form"
      class=".searchform.SearchFormView"
      permission="zope2.View"
    />

In questo caso la mia vista è indipendente da contesto e quindi ho specificato for="*". Nel caso voglia invece utilizzare un template custom dovrò fare:

from plone.z3cform.layout import FormWrapper

class SearchFormView(FormWrapper):

    index = ViewPageTemplateFile('custom_search_form.pt')
    form = esgraphfolderForm
    
    def getData(self):
        ....
        #self.form_instance è l'istanza della form e quindi dentro
        #self.form_instance.results trovo i dati della form già validati
        ....
        return data

Visto che la registrazione sul zcml non cambia, l'unica cosa che manca è la vista custom ('custom_search_form.pt'):

....
<div id="skel-contents">
     <span tal:replace="structure view/contents" />
</div>
...
<div tal:repeat="result view/getData"></div>
....

Nel page template, view farà riferimento alla browserview che fa da wrapper alla form. Dentro contents ci saranno i widgets.

Spero che sia utile ... buon lavoro !

documentazione

Posted by Yuri at 2010-06-21 08:18
http://svn.zope.org/z3c.form/trunk/src/z3c/form/

qui c'è molta documentazione, assieme a molti pacchetti z3c.*

re: documentazione

Posted by Davide Moro at 2010-06-25 12:06
Ciao Yuri,

è vero che esiste molta documentazione su z3c.form, ma di che tipo? Il problema è che spesso è orientata a dei Plone "power developer".

I doctest, pur essendo rigorosi e completi, non sono recepiti con la stessa semplicità di un tutorial comprensivo di esempi di codice python, costrutti zcml (spesso nei test i componenti vengono registrati con una registerAdapter ed un neofita seppur tecnico non sarà in grado facilmente di mettere nel proprio configure.zcml le cose giuste), istruzioni per il setup e immagini di esempio di quello che si ottiene.

re: documentazione

Posted by Yuri at 2010-06-28 08:09
vero, quindi prima spiegherei cos'è z3c.form e come funziona, cioè cosa permette di fare. Spesso non è chiaro :)

re: re: documentazione

Posted by Davide Moro at 2010-06-28 08:22
Concordo con te su questo. Certi argomenti per la loro complessità richiederebbero un'esposizione un po'più organica. Sarebbe ottimale una guida dalla A alla Z e non una bloggata spot come spesso facciamo (tipo: http://redomino.com/it/labs/blog/davide-moro/form-wizard) ma questo richiederebbe uno sforzo in termini di tempo non indifferente.

Vedremo cosa si può fare :)

Eccomi!

Posted by Yuri at 2010-08-18 15:40
Eccomi, ho cominciato a pasticciare con z3c.form e quindi sono capitato qui?

Che dire, ti do tantissima ragione, sto facendo un sacco di fatica nel capire la filosofia e come funziona. Ad esempio, in questo caso, mi ero posto il semplice obiettivo di stampare i risultati della form. Però in giro ho trovato solo redirect o add form, o CRUD. Ma un semplice esempio del tipo "hai inserito i seguenti valori", manca :)

L'esempio qui sopra, ad esempio, mescola il template che mostra la form con quello che mostra i risultati (poiché è una form di ricerca, questa è cosa buona e giusta :P ).

Appena trovo qualcosa di interessante, posto qualcosa!