Other Uses of Tales

TALES can be used outside of Zope Page Templates. Zope 3 uses TALES expressions embedded in ZCML in a few instances where some sort of filter expression is needed. One example is the ‘filter’ attribute of the ‘browser:menuItem’ element:

<menuItem
    title="Show details"
    action="show_details.html"
    permission="zope.View"
    filter="not:context/metadata_is_missing"
    />

Ulrick Eck has written code to use TALES expressions in his own Products. Here is sample Zope 2 code that he contributed to the mailing list:

import Globals
from Globals import Persistent
from Acquisition import aq_inner, aq_parent
from AccessControl import getSecurityManager, ClassSecurityInfo

from Products.PageTemplates.Expressions import getEngine, _SecureModuleImporter

SecureModuleImporter = _SecureModuleImporter()

class Expression (Persistent):
    method_name = ''
    _expr = None

    security = ClassSecurityInfo()

    def __init__(self, method_name):
        self.method_name = method_name
        e = getEngine()
        self._expr = e.compile(method_name)

    security.declarePrivate('validate')
    def validate(self, inst, parent, name, value, md):
        # Zope 2.3.x
        return getSecurityManager().validate(inst, parent, name, value)

    def __call__(self, context):
       e = getEngine()
       if self._expr is None:
             self._expr = e.compile(self.method_name)
       c = e.getContext(context)
       return c.evaluate(self._expr)

Globals.InitializeClass(Expression)


def exprNamespace(client,form, field=None, value=None, object=None):
    root = client.getPhysicalRoot()
    c = {'form': form,
         'field': field,
         'value': value,
         'here': object,
         'nothing': None,
         'options': {},
         'root': root,
         'request': getattr(root, 'REQUEST', None),
         'modules': SecureModuleImporter,
         }
    return c

Use it like this:

myExpr = Expression('string:this is a text')
ns = exprNamespace(...)
result = myExpr(ns)