Использование макроса tal в Chameleon

Я пользователь 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)

person Alex Volkov    schedule 08.04.2014    source источник


Ответы (1)


Хамелеон представляет макросы внутри в форме, отличной от реализации стандартного шаблона страницы Zope, и они несовместимы. Таким образом, вы можете использовать только макросы Chameleon из других шаблонов Chameleon.

Вы можете попробовать установить Five.pt, который обезьяна исправляет Zope, чтобы использовать Chameleon для всех шаблонов страниц.

person David Glick    schedule 08.04.2014
comment
Я попытался использовать z3c.pt для анализа существующей страницы main_template.pt с помощью анализатора-хамелеона, чтобы я мог загрузить из него макрос, но я получил слишком много ошибок анализа, с которыми я не хочу иметь дело. В качестве временного решения я создал страницу BrowserView в старом стиле с более старым шаблоном, где я вставляю HTML-код, сгенерированный хамелеоном, в качестве структуры. - person Alex Volkov; 11.04.2014