Zope (ZPT) перекрывающиеся теги
Я пытаюсь создать открытый div
пометить условие и закрыть div
тег в другом состоянии с TAL в шаблоне страницы Zope, но я не могу перекрывать теги.
Вот мой код:
<div id="notaccordion">
<tal:x repeat="item python:range(26)">
<tal:x define="global block_name python:current.values()[0]['block_name']">
<tal:x condition="python:isDone">
</div>
</tal:x>
<tal:x condition="python:not isDone">
<tal:x replace="python:block_name">
</tal:x>
<div>
</tal:x>
</tal:x>
</tal:x>
</div>
Важной частью является:
<tal:x condition="python:isDone">
</div>
</tal:x>
И здесь ошибка.
Compilation failed
zope.tal.taldefs.TALError: TAL attributes on <tal:x> require explicit </tal:x>
Я пытался с помощью скрипта Python, но он тоже не работал.
<div id="notaccordion">
<tal:x repeat="item python:range(26)">
<tal:x define="global block_name python:current.values()[0]['block_name']">
<tal:x condition="python:isDone">
<tal:x content="python:context[close_div]()">
</tal:x>
</tal:x>
<tal:x condition="python:not isDone">
<tal:x replace="python:block_name">
</tal:x>
<tal:x content="python:context[open_div]()">
</tal:x>
</tal:x>
</tal:x>
</tal:x>
</div>
С close_div
сценарий:
print '</div>'
return printed
Возвращается </div>
вместо </div>
Если вам интересно, почему я это делаю. У меня есть древовидная структура, которую мне нужно отобразить. Поскольку я (думаю, что) не могу сделать это рекурсивно, я пытаюсь эмулировать это, используя список LIFO. А также current
мой текущий узел
Я пытаюсь добиться этого (узел является диктом диктата... используется как дерево):
lifo = list()
lifo.append([node, False])
while lifo:
current, isDone = lifo[-1]
block = current.keys()[0]
if isDone:
print '</div>'
lifo.pop()
else:
lifo[-1][1] = True
print '<div>'
print block
children = current[block].get('children', {})
if children:
for childBlock, childValue in children.items():
lifo.append([{childBlock:childValue}, False])
Любая помощь или предложение приветствуется
1 ответ
Шаблоны страниц должны быть действительными XML, поэтому вы не можете просто произвольно включать теги. Древовидные структуры лучше всего обрабатывать рекурсивно (возможно, с помощью фрагментов макросов):
<metal:recurse define-macro="list">
<ul>
<li tal:repeat="el elements">
<span tal:content="el/id">element id</span>
<metal:block tal:condition="el/children"
tal:define="elements el/children">
<div metal:use-macro="template/macros/list" />
</metal:recurse>
</li>
</ul>
</metal:recurse>
Например, портлет навигации Plone также использует отдельный шаблон макроса для каждого уровня, вызывая себя для отображения дочерних элементов (recurse
это тот же шаблон).
Для вашего конкретного метода, используя open_div
или же close_div
сценарий, вы должны пометить значение содержимого какstructure
чтобы предотвратить автоматическое экранирование HTML:
<tal:x content="structure python:context[open_div]()">