[Zope] Strange CSS inclusion BUG
Dieter Maurer
dieter@handshake.de
Tue, 19 Sep 2000 21:25:32 +0200 (CEST)
Li Dongfeng writes:
> To use CSS file, I put the following line in the head of HTML files:
>
> <dtml-if local_css>
> <link href="<dtml-var "local_css.absolute_url()">"
> rel="stylesheet" type="text/css">
> </dtml-if>
>
> Where "local_css" is a DTML document containing CSS style sheet.
> But the DTML generates the following error message:
>
> Error Type: AttributeError
> Error Value: 'string' object has no attribute 'absolute_url'
>
> If I strip the <dtml-if protection, the code works OK.
> Why is the DTML document local_css changed into a string
> after <dtml-if>?
That is a dtml-if caveat!
The dtml-if documentation says that dtml-if caches its
variable value to save time, in case the variable is
in fact a function that takes long to call.
What happens in your case:
<dtml-if local_css> looks up "local_css" and because
it is callable, it gets called (i.e. rendered).
The result is a string. This string is bound to
"local_css" inside the <dtml-if>...</dtml-if>.
Therefore, "local_css.absolute_url" results in
the error you observed.
You can replace <dtml-if local_css> by
<dtml-if "_.has_key(local_css)">.
This will not be equivalent to "<dtml-if local_css>" but
good enough for your purpose.
If you want to emulate it more faithfull, you could
use:
<dtml-if "_.has_key(local_css) and _['local_css']">
This is equivalent ot "<dtml-if local_css>" with the
exception of the caching.
Dieter