- -
-

Custom TALES extensions

-

PyAMS defines a custom expression for TALES called extension.

-

When this expression is encountered, the renderer is looking for an -ITALESExtension -multi-adapter for the current context, request and view, for the current -context and request, or only for the current context, in this order. -If an adapter is found, the renderer call it’s render() method with -the expression parameters as input parameters.

-

For example, the metas extension is an ITALESExtension adapter defined into -pyams_skin.metas module which can be used to include all required headers in -a page template. Extension is used like this in the page layout template:

-
<tal:var replace="structure extension:metas" />
-
-
-

This extension is defined like this:

-
from pyams_skin.interfaces.metas import IHTMLContentMetas
-from pyams_utils.interfaces.tales import ITALESExtension
-from pyramid.interfaces import IRequest
-
-from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
-
-@adapter_config(name='metas', context=(Interface, IRequest, Interface), provides=ITALESExtension)
-class MetasTalesExtension(ContextRequestViewAdapter):
-    '''extension:metas TALES extension'''
-
-    def render(self, context=None):
-        if context is None:
-            context = self.context
-        result = []
-        for name, adapter in sorted(self.request.registry.getAdapters((context, self.request, self.view),
-                                                                      IHTMLContentMetas),
-                                    key=lambda x: getattr(x[1], 'order', 9999)):
-            result.extend([meta.render() for meta in adapter.get_metas()])
-        return '\n\t'.join(result)
-
-
-

Some TALES extensions can require or accept arguments. For example, the absolute_url extension can accept -a context and a view name:

-
<tal:var define="logo config.logo">
-    <img tal:attributes="src extension:absolute_url(logo, '++thumb++200x36.png');" />
-</tal:var>
-
-
-

The extension is defined like this:

-
from persistent.interfaces import IPersistent
-from pyams_utils.interfaces.tales import ITALESExtension
-
-from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
-from pyramid.url import resource_url
-from zope.interface import Interface
-
-@adapter_config(name='absolute_url', context=(IPersistent, Interface, Interface), provides=ITALESExtension)
-class AbsoluteUrlTalesExtension(ContextRequestViewAdapter):
-    '''extension:absolute_url(context, view_name) TALES extension'''
-
-    def render(self, context=None, view_name=None):
-        if context is None:
-            context = self.context
-        return resource_url(context, self.request, view_name)
-
-
-
- - -