[Grok-dev] Re: Skinning/themeing

Kevin Smith kevin at mcweekly.com
Fri May 18 19:07:31 EDT 2007



Martijn Faassen wrote:
> Martin Aspeli wrote:
>> Lennart Regebro wrote:
>>
>>> Sure:
>>> http://mail.zope.org/pipermail/grok-dev/2007-March/000476.html
>>
>> I see! This looks very powerful and cool.
>>
>> I assume we are still considering viewlets as the way of making 
>> "pluggable" UIs, i.e. aspects of a page where you can plug in new 
>> elements without modifying the view, and where you can vary the thing
>>  being plugged in by context type.
>>
>> Or are we thinking this is the general approach to page composition?
>
> I admit that though I've seen them in use in Schooltool (and being put 
> off by the tremdendous amount of ZCML they seemed to need) and after 
> having listened to Philipp's talk about them at last year's DZUG 
> conference, I still don't grok them. Philipp's talk was fine, I think 
> that's because I haven't actually tried to use them myself yet, so 
> they don't stick in my brain.
>
> So my answer to this: I don't know. :) I'm hoping Lennart has a better
> answer.
The work of creating viewlets has been greatly simplified in 
megrok.quarry (based on Lennart's megrok.viewlet work). For example...

class MyView(quarry.View):
    """<html metal:use-macro="context/@@master/page">
       <body metal:fill-slot="body">
       <span tal:replace="structure provider:myviewlets" />
       </body>
       </html>
      """
    template = grok.PageTemplate(__doc__)

    def render(self): pass # trick grok into not requiring 
app_templates/myview.pt

class MyViewlets(quarry.ViewletManager):
    grok.context(MyView)
    quarry.name('myviewlets') # provider:myviewlets

class MyViewlet_10(quarry.Viewlet):
    grok.viewletmanager(MyViewlets)

    def render(self):
        return "GROK SMASH..."

class MyViewlet_20(quarry.Viewlet):
    grok.viewletmanager(MyViewlets)

    def render(self):
        return "ZCML"

class MyViewlet_30(quarry.Viewlet): # using inline template
    """<b>SQL</b>
    """
    grok.viewletmanager(MyViewletManager)
    quarry.template(__doc__)

class MyViewlet_40(quarry.Viewlet): # using common templates
    grok.viewletmanager(MyViewlets)
    quarry.template('myproject.common.boxlayout')

    def entries(self):
        return ['PHP', 'ASP', 'RUBY']

... add as many viewlets as you need.

The viewlets are automatically ordered by view name.  Viewlets are also 
be more view-l.ike so templates, self.url, self.application_url and the 
like are all available.

>
>> Also I'm not convinced that it solves the general themeing/branding
>> problem. The premise of Deliverance (or something like it) is that
>> the designer (be he the same or a different person to the one doing
>> the compositing and the raw development) makes a full, flat, static
>> HTML page (or pages) which defines "the way it should look", and then
>> pulls the relevant parts of the "composed" page into the correct
>> parts that static page. That allows them to use familiar tools (e.g.
>> Dreamweaver) and design a "whole" into which the application slots
>
>> The match approach described in the email above, as I understand it,
>> is about defining a pipeline which post-processes the "bits" of a
>> page (which is of course useful for all kinds of things). It works
>> the opposite way to Deliverance, in that you start with a "composed"
>> set of markup and then selectively swap out bits of it. I can't see
>> how someone wearing ad designer hat would make lots of these little
>> match classes and template snippets to theme a page.
>
> Actually there are two places to use xpath with MatchViews. One place is
> to match with part of a page. That could be a part of a page, but note
> it could also be the whole page.
>
> Then the second place where you can use xpath is to pull in bits of 
> the matched HTML.
>
> So, you could set up a match view that matches with the whole page. The
> template would be a fully themed page. It would pull in bits of the
> original page using xpath.
>
> I think that this means we could do what you describe Deliverance 
> does. Hopefully we also allow the user to still access the original 
> context object somehow, to get information from it the python-way. 
> This breaks a pure pipeline model (which has definite advantages) but 
> the gain in expressive power may be worth it.
>
> We have many details to work out, such as ordering issues. Which 
> MatchViews get applied first? What if you have a whole-page MatchView 
> and then also ones that match smaller bits?
>
> I'm not guaranteeing any of this will actually work in practice. :) 
> One thing we should definitely do is to make a careful study of 
> Deliverance before we start implementing this. I also need to get a 
> better picture of how viewlets fit into all of this.
>
In ZPT land, Deliverance and MatchView are orthogonal to viewlets. When 
used properly, they are a much simpler and powerful mechanism for 
creating pluggable UI's like Trac uses. If however, Grok were template 
neutral, I'm not sure what kind of a role *if any* viewlets could play.
> Regards,
>
> Martijn
>
> _______________________________________________
> Grok-dev mailing list
> Grok-dev at zope.org
> http://mail.zope.org/mailman/listinfo/grok-dev
>

Kevin Smith


More information about the Grok-dev mailing list