[Zope] Using "global" images in /root/subfolder

Martijn Pieters mj@antraciet.nl
Tue, 19 Oct 1999 09:33:07 +0200


At 05:58 19/10/99 , Stefan Hoffmeister wrote:

>Let's assume the following structure of a site
>
>   /root
>      /global_images
>         mail_png
>         link_png
>
>      /content
>         some_content  (DTML document)
>
>In some_content, I would like to use something to the effect of
>
>   <dtml-var mail_png>
>
>to take advantage of the image "mapping" provided by Zope. But how can I
>address mail_png?
>
>The goal is to address a few global images from any location on the site
>with the least amount of work possible. I am as far as
>
>   <dtml-var globalImage>
>
>in "some_content". "globalImage" is a DTML document in /root that contains
>
>   <dtml-var graphics.mail_png>

This tries to access the object named 'graphics.mail_png', _with_ the dot 
in the name. All characters are considered part of the identifier, none 
have special meaning.


>to directly access the image. For the less interesting parts
>
><dtml-var "graphics.mail_png">

Here you are using a python expression (you are using quotes). You are 
asking for the mail_png object, subobject of the graphics object. Bingo, 
but you are accessing the object, not calling it. Your generated output 
will contain a object reference, something like <Image instance at 86bbe0>.

><dtml-with "graphics">
>   <dtml-var "mail_png">
></dtml-with>

Watch the quotes! In between quotes, you are doing the same as with 
<dtml-var expr="mail_png">, so you are using a Python expression, whereas 
<dtml-var mail_png> or <dtml-var name=mail_png> would call it. This is an 
import difference. See the DTML Users Guide for more details.

Code that would solve your problem:

  <dtml-with graphics><dtml-var mail_png></dtml-with>
   (the usual way. Will place a HTML IMG tag)
or
  <dtml-var "_.str(graphics.mail_png)">
   (Does the same, only more explicit)
or
  <dtml-var "graphics.mail_png.tag()">
   (Uses an alternative tag rendering method, you can pass
    extra attributes in, like border=0)



><dtml-with "graphics">
>   <dtml-with "_.namespace(AName='mail_png')">
>     <dtml-var "mail_png">
>   </dtml-with>
></dtml-with>

This doesn't do anything but add a variable called AName to the namespace 
that has the string 'mail_png' for a value, which you then don't use.


><dtml-with "graphics">
>   <dtml-with "_.namespace(AName='mail_png')">
>     <dtml-var "_['AName']">
>   </dtml-with>
></dtml-with>

Above code will place the string 'mail_png' in your generated output.


>works, but unfortunately,
>
>     <dtml-var "_['AName']">
>
>emits "mail_png" as the *text*, not the image.

As you discovered. _[] looks up the variable with the name given by that's 
in between the brackets. In this case 'AName'. AName is a variable that 
contains the value 'mail_png'. If you wan to look up and call mail_png this 
way you'll either have to do:

   <dtml-var "_[AName]">
or
   <dtml-var "_['mail_png']">

Note the lack of quotes around AName. You now don't treat is as a string 
literal, but as a variable whose contents are passed to _[].

>  IOW, I am stuck.
>Oh, I have no clue how to pass a parameter to the DTML document, so that I
>can say
>
>   <dtml-var name="globalImage(AName='mail_png')">
>   <dtml-var name="globalImage(AName='link_png')">
>
>or whatever works.

You should be able to get things working now.

--
Martijn Pieters, Web Developer
| Antraciet http://www.antraciet.nl
| Tel: +31-35-7502100 Fax: +31-35-7502111
| mailto:mj@antraciet.nl http://www.antraciet.nl/~mj
| PGP: http://wwwkeys.nl.pgp.net:11371/pks/lookup?op=get&search=0xA8A32149
------------------------------------------