[Zope] Continued problem tal:condition
KevinL
darius@obsidian.com.au
23 Aug 2002 12:25:08 +1000
On Fri, 2002-08-23 at 06:25, Dieter Maurer wrote:
> KevinL writes:
> > On Thu, 2002-08-22 at 04:30, Dieter Maurer wrote:
> > > zope writes:
> > > > ...
> > > > Now all my macros are in the same page.
> > > > I m am trying to use :
> > > > <div tal:condition="request/form/lkid | nothing">
> > > > <tal:block define="mName
> > > > python:here.oms.Users.lib.pset_links(lkid=request.form['lkid'])">
> > > > <metal:block use-macro="container/zptmac_memall/macros/?mName">
> > > > List
> > > > </metal:block>
> > > This does not work, because TAL-attributes are only evaluated once
> > > all METAL-attributes have been executed.
> > >
> > > As a consequence you must not refer to a TAL defined variable
> > > in a METAL attribute.
> > >
> > > Use a Python script to return the macro object you need.
> > >
> > >
> > > Furthermore, you cannot suppress a METAL attribute execution
> > > with a "tal:condition" (for the same reasons).
> > >
> > > Use an (almost) empty macro in such a case (it may need to
> > > define slots, when you call it with "metal:fill-slot").
> >
> > Um. That's wrong, I believe.
> It's explicitely stated in the documentation.
>
> And, think a moment:
>
> Many tal attributes reference things available only under
> special circumstances, e.g. form variables.
> When you evaluate them in a different context, you will get
> exceptions.
>
> Then, think of macro expansion. When macro expansion is
> enabled, you expand macros outside when you look at the
> template source, outside of any special context. You cannot
> rely on tal attributes for that.
>
> Of course, it would be possible to not look at tal attributes
> when macro expansion is enable but look at them when it is
> disabled. But that would be a really strange design....
>
>
> Dieter
>
I just added a page template, test_macro, and surrounded the default
content with "metal:block define-macro="test". I added another ptl,
test, and made it consist entirely of:
<span tal:define="mName string:test">
<metal:block use-macro="here/test_macro/macros/?mName">
</metal:block>
</span>
When you view test, you get the test_macro macro appearing.
This works. More than that, the conditional picking of macros like that
is important, I think - otherwise a lot of the dynamicness of a site
vanishes. Perhaps we're talking at cross-purposes? Or have I been
relying on a brokenness in macros/tal? I can certainly see in the
documentation that it says macros are expanded before tal is executed,
but that seems to not be the case in practice?
KevinL