+ +
+

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)
+
+
+
+ + +