Plone 在变色龙中使用tal宏

Plone 在变色龙中使用tal宏,plone,chameleon,Plone,Chameleon,我是一名Plone用户,我已经使用Products.Five.browser.pagetemplatefile.ViewPageTemplateFile中的tal宏很长一段时间了,并创建了一个现有宏和模板库 我通过grokcore.chameleon 1.0.3开始使用chameleon页面模板,并希望在现有框架内继续使用它们。例如,我希望能够导入tal宏,然后使用chameleon填充宏插槽 到目前为止,我尝试了几种导入现有宏的方法,但都不起作用即使安装了Chameleon 2.14,Load

我是一名Plone用户,我已经使用Products.Five.browser.pagetemplatefile.ViewPageTemplateFile中的tal宏很长一段时间了,并创建了一个现有宏和模板库

我通过grokcore.chameleon 1.0.3开始使用chameleon页面模板,并希望在现有框架内继续使用它们。例如,我希望能够导入tal宏,然后使用chameleon填充宏插槽

到目前为止,我尝试了几种导入现有宏的方法,但都不起作用即使安装了Chameleon 2.14,Load'关键字也未启用[1]

我一直在寻找一个兼容层,但到目前为止我只找到了z3c.pt,它的目的是加速.pt页面呈现,而不是提供兼容层。[2]

是否有激活tal宏然后从变色龙页面模板插入信息的软件包? 作为一种解决方法,我可以渲染tal模板,渲染变色龙模板,然后进行字符串替换,但必须有人以更优雅的方式解决这个问题

[1]

[2]

更新 作为一种解决方法,我创建了一个生成中间页面的函数,它接受由chameleon页面模板生成的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\u-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)
来自五大进口集团
从zope.interface导入接口
从grokcore.chameleon.components导入ChameleonPageTemplate
从通用导入将_插入_主控
类MyView(grok.View):
grok.context(接口)
grok.require('zope2.View')
grok.name('myview')
def渲染(自):
view=ChameleonPageTemplate('Hello,world!')
将insert_返回到_主控(视图渲染(self)、self)

变色龙在内部以不同于Zope的标准页面模板实现的形式表示宏,两者不兼容。因此,您只能使用来自其他变色龙模板的变色龙宏


您可以尝试安装five.pt,monkeypatches Zope将其用于所有页面模板。

我尝试使用z3c.pt使用Chameleon解析器解析现有的main_template.pt页面,以便从中加载宏,但我不想处理太多解析错误。作为一个临时解决方案,我使用旧模板创建了旧式BrowserView页面,在其中插入变色龙生成的html作为结构。