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

Он возвращает &lt;/div&gt; вместо </div>

Если вам интересно, почему я это делаю. У меня есть древовидная структура, которую мне нужно отобразить. Поскольку я (думаю, я) не могу сделать это рекурсивно, я пытаюсь эмулировать это, используя список LIFO. И current — мой текущий узел.

Я пытаюсь добиться этого (узел - это dict of dict... используется как дерево):

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])

Любая помощь или предложение приветствуются


person Cyrille    schedule 16.04.2013    source источник


Ответы (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]()">
person Martijn Pieters    schedule 16.04.2013
comment
Отлично, ключевое слово structure отлично сработало. Возможно, я воспользуюсь вашим макросом позже. Спасибо. - person Cyrille; 16.04.2013