我是Plone用户,我一直在使用Products.Five.browser.pagetemplatefile.ViewPageTemplateFile中的tal宏很长一段时间,并创建了一个现有宏和模板库.
我开始通过grokcore.chameleon 1.0.3使用变色龙页面模板,并希望在现有框架中继续使用它们.IE我希望能够导入tal宏,然后使用变色龙填充宏插槽.
到目前为止,我尝试了几种导入现有宏的方法,但没有一种方法可行.即使安装了Chameleon 2.14 [1],也不会启用"加载"关键字.
我一直在寻找一个兼容层,但到目前为止我发现的只是z3c.pt,目的是加速.pt页面渲染而不提供兼容层.[2]
是否有任何软件包可以激活tal宏,然后从Chameleon页面模板中插入信息?作为一种解决方法,我可以渲染tal模板,渲染变色龙模板,然后进行字符串替换,但必须有人以更优雅的方式解决这个问题.
[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()
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
任何使用变色龙的客户端视图
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)
Run Code Online (Sandbox Code Playgroud)
Chameleon在内部以与Zope标准页面模板实现不同的形式表示宏,并且两者不兼容.因此,您只能使用其他Chameleon模板中的Chameleon宏.
您可以尝试安装five.pt,monkeypatches Zope将Chameleon用于所有页面模板.