2013-04-16 3 views
2

오픈 div 태그 조건을 생성하고 Zope 페이지 템플릿에서 TAL을 사용하여 다른 조건으로 div 태그를 닫으려고하지만 태그를 겹치지 않아야합니다.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> 

파이썬 스크립트로 시도했지만 작동하지 않았습니다. close_div 스크립트와

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

: 나는 그것을하고 있어요 왜 당신이 궁금해하는 경우

print '</div>' 
return printed 

&lt;/div&gt; 대신 </div>

반환합니다. 표시해야하는 트리 구조가 있습니다. 나는 (내가 생각하기에) 반복적으로 할 수 없다고 생각하기 때문에, 나는 LIFO리스트를 사용하여 에뮬레이트하려고한다. 그리고 current이 나의 현재 노드입니다. 그래서, 어떤 도움이나 제안이

답변

1

페이지 템플릿이 유효한 XML을 수 있습니다 감사합니다

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

:

나는이 달성하려고 (노드는 딕셔너리의 DICT ... 트리로 사용되는) 당신은 임의적으로 꼬리표를 아무렇게나 포함시킬 수 없습니다. 트리 구조는 가장 (아마도 매크로 조각과) 재귀 적으로 처리됩니다

<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 인 렌더링하기 위해 자체에 호출, 각 레벨에 대한 separate macro template를 사용 같은 템플릿). open_div 또는 close_div 스크립트를 사용하여 특정 방법

, 당신은 복용 장소에서 탈출 자동 HTML을 방지하기 위해 mark the content value as structure해야합니다

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

대,'structure' 키워드가 잘 작동했다. 나중에 매크로를 사용하겠습니다. 고맙습니다. – Cyrille