[Grok-dev] Re: Re: Re: viewlets, pagelets and friends

Luis De la Parra lparrab at gmx.net
Wed Aug 15 12:45:42 EDT 2007


hi again,

Darryl Cousins wrote:
> 
> The use of the pagelet concept makes it imperiative to be able to define
> which interface the registered template provides (usually IPageTemplate or
> ILayoutTemplate) and also to be able to define a name (possible required
> by a view) and thirdly to be able to define the macro to be used from
> within the template (introducing `z3c.macro`_).
> 
> For these reasons the  ``grok.template`` has been reinvented in
> `mars.view`_ to tell the grokker that the view should look up a named
> template. And templates are now registered as any other component using
> grokkers. The difference being that the component class is a factory - and
> therefore named as such.
> 
> A template is not bound to a view as an attribute. Instead the view will
> look up a template in the component registry, a template can then be
> easily reused by many views (as layout templates usually are) and a view
> can be created to look up as many templates as it may require (by name or
> interface depending on design and needs).


I think I'm starting to get it (finally!) =)

so I can imagine to have something like:

### general layout for my site ###

class SiteLayout(mars.template.LayoutFactory):
        grok.context(interface.Interface)
        grok.template('site_layout.pt')

#

so that registers a template which "provides" ILayout and can be found for
every view/context.

then I would have
###
class Contact(grok.Model):
        name = ""
        email = ""

class ContactPagelet(mars.view.PageletView):
        grok.name('index.html')
        grok.context(Contact)

        def helper_method_for_my_view(self):
                pass

class ContactTemplate(mars.template.TemplateFactory):
        grok.template('contact.pt')
        grok.context(ContactPagelet)
##

the pagelet would look up the layout template and find the SiteLayout, 
then, if "render" is not defined, it would look up a template implementing
IPageTemplate (ContactTemplate) and render it...

just a few questions: 
1)do PageTemplates ever provide some extra functionality, or do they
always "only" render the template file?
2)Are not PageletViews more or less "hard-wired" to a given template? (a
template can be used from several pagelets, but a pagelet can only use one
template)

if those two are correct, I think having to create an extra class for the
template registration is only boiler-plate code that's not really
necessary?

I patched the "Pagelet Grokker" locally in meta.py in mars.view to register
a template providing IPageTemplate if the grok.template declaration is
used, so that I can replace the code above for :

###
class ContactPagelet(mars.view.PageletView):
        grok.name('index.html')
        grok.context(Contact)
        grok.template('contact.pt')

        def helper_method_for_my_view(self):
                pass

##
and seems to have exactly the same effect as with the two classes... am I
missing something here/losing "flexibility" or whatever that I might need
at a later time?

I also think the pageletgrokker should ensure that a template is registred
for the pagelet OR it defines a render method, but not both. I don't know
if such a check would fit in mars or if it would be more grok-like.

regards. luis




More information about the Grok-dev mailing list