2013-04-16 3 views
2

Я пытаюсь создать условие тега div и закрыть тег div в другом состоянии с TAL в шаблоне страницы Zope, но мне не разрешено перекрывать теги.Теги перекрытия Zope (ZPT)

Вот мой код:

<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 - мой текущий узел.

я пытаюсь достичь этого (узел является ДИКТ из Словаре ... используется как дерево):

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 навигации портлет, например, также использует separate macro template для каждого уровня, вызывая в себе, чтобы сделать детей (recurseявляется в тот же шаблон).

Для вашего конкретного метода с использованием open_div или close_div сценария, вам нужно mark the content value as structure, чтобы предотвратить автоматический HTML спасаясь от проходящего:

<tal:x content="structure python:context[open_div]()"> 
+1

Великих, 'structure' ключевого слова заставило его работать нормально. Я буду использовать ваш макрос позже. Спасибо. – Cyrille

 Смежные вопросы

  • Нет связанных вопросов^_^