[Zope] Re: what's the difference between metal:block and tal:block?

J Cameron Cooper jccooper@jcameroncooper.com
Thu, 19 Jun 2003 09:34:31 -0500

> I guess I understand the syntax part of the question, but what I don't 
> understand is why in some cases a METAL declaration is needed. Let me 
> give you an example, a code snippet from a stock Plone site. This code 
> is inside a <metal:block define-macro>:
> <tal:block tal:condition="no_types">
>     <select id="filter_selection"
>             name="filter_by_portal_type:list"
>             style="float: left"
>             onChange="submitFilterAction()"
>             tabindex=""
>             tal:attributes="tabindex tabindex/next|nothing;">
>         <option value="#"
>                 tal:attributes="selected
>                 python:test((len(filterTypes)>1 or 
> len(filterTypes)==0), 'selected', '');"
>                 i18n:translate="label_show_all_items">
>         Show All Items
>         </option>
>         <metal:block tal:repeat="type types">
>             <option value="#"
>                     tal:define="typetitle type/Title; typeid type/getId"
>                     i18n:translate="label_show_x_only"
>                     tal:attributes="value typeid;
>                                     selected python:test( 
> len(filterTypes)==1 and (typeid in filterTypes), 'selected', '');"
>             ><span i18n:name="type"><span i18n:translate="" 
> tal:content="string:${typetitle}" tal:omit-tag="" /></span>s 
> only</option>
>         </metal:block>
>     </select>
>     <input type="hidden" name="filter_by_Subject:tokens" value="" />
>     <!--you can filter by subject keywords by filling in this value-->
> </tal:block>

You mean the option repeat toward the end, right? I can see why that 
would be confusing. There really isn't any reason (apart, perhaps, from 
historical) for that to be a metal:block. If it needs to be a block, it 
would be better written as '<tal:block repeat="type types">'. Of course, 
that tal:repeat could/should probably be moved into the option tag, 
which is what is really repeating. (Though perhaps the use of the define 
nixes that. I'd have to check the order of operations.)

Similarly, the very first tag has redundant information, and could be 
written '<tal:block condition="no_types">'.

Note the extract above works just fine (although perhaps a little slower 
than it might otherwise be) because of the way namespaces work. Saying 
<metal:block> gets you nothing more than the ability to use metal 
attributes without their own namespaces in a non-rendering tag, and 
unless you actually use a metal statement in it, it's essentially 
equivalent to, say, <span tal:omit-tag="">, but shorter and less 
explicit. (Plus a little extra compiler work, I guess.) And, as the 
first tag points out, there's no problem with explicitly specifying the 
namespaces even when they're implied. It's just a little more typing.