Я пользователь Plone, и я уже давно использую макросы tal из Products.Five.browser.pagetemplatefile.ViewPageTemplateFile и создал библиотеку существующих макросов и шаблонов.
Я начал использовать шаблоны страниц-хамелеонов в grokcore.chameleon 1.0.3 и хотел бы продолжать использовать их в существующей структуре. т.е. Я хочу иметь возможность импортировать макросы tal, а затем заполнять слоты макросов с помощью хамелеона.
До сих пор я пробовал несколько способов импорта существующего макроса, но ни один из них не работал. Ключевое слово «Загрузить» не включено, даже если установлен Chameleon 2.14[1].
Я искал слой совместимости, но пока нашел только z3c.pt, цель которого — ускорить отрисовку страницы .pt, а не обеспечить слой совместимости.[2]
Существуют ли какие-либо пакеты, которые активируют макрос tal, а затем вставляют информацию из шаблона страницы Chameleon? В качестве обходного пути я могу отобразить шаблон tal, отобразить шаблон хамелеона, а затем выполнить подстановку строк, но должен быть кто-то, кто решил эту проблему более элегантным способом.
[1] как использовать макросы с пирамидой/ZPT (Chameleon) а>
[2] https://pypi.python.org/pypi/z3c.pt
Обновить В качестве обходного пути я создаю функцию, которая создает промежуточную страницу, которая принимает HTML-код, сгенерированный шаблоном страницы-хамелеона.
common.py
from zope.publisher.browser import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
def insert_into_master(html, view):
class View(BrowserView):
def __call__(self):
self.data = html
return ViewPageTemplateFile('pt/master_holder.pt')(self)
rendered = View(view.context, view.request)
return rendered()
pt/master_holder.pt
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
metal:use-macro="here/main_template/macros/master"
i18n:domain="Plone"
xml:lang="en"
lang="en">
<div
metal:fill-slot="main"
tal:content="structure:view/data"
/>
</html>
любое клиентское представление, использующее хамелеон
from five import grok
from zope.interface import Interface
from grokcore.chameleon.components import ChameleonPageTemplate
from common import insert_into_master
class MyView(grok.View):
grok.context(Interface)
grok.require('zope2.View')
grok.name('myview')
def render(self):
view = ChameleonPageTemplate('<div>Hello, world!</div>')
return insert_into_master(view.render(self), self)