2014-05-18 1 views
0

백엔드에서 API로부터 폴더 구조를 얻고 있습니다. 이 구조를 반복적으로 반복하여 모든 폴더를 가져옵니다. 이것들은 모두 '납작한'순서화 된 사전에 저장됩니다. 각 폴더에는 구조, 부모 폴더의 ID, 하위 폴더의 양 및 하위 노드의 수를 정의하는 몇 가지 속성이 저장됩니다.폴더 구조의 '플랫'사전에서 계층 적으로 정렬되지 않은 목록

이제이 주문 된 사전에서 나는 Genshi와 함께 훌륭한 계층 적보기를 만들려고 노력하고 있습니다. 그러나 지금까지 얻은 것 중 가장 멀리는 아래 템플릿입니다. 결과적으로 루트 수준과 한 수준 아래의 단 2 수준이됩니다. 더 깊은 폴더는 두 번째 레벨에 표시됩니다.

나는 데이터를 처음으로 파싱 할 때 많은 관계를 맺을 필요없이 폴더가있는 수준을 얻으 려하지 않고이 작업을 수행하려고합니다. 누구든지 영리한 아이디어가 있습니까? 내가 주석으로

<body> 
    <div class="main_content"> 
    <h1>Catalogue Tree</h1> 
    <ul> 
     <li py:for="nodeId, nodeProps in nodes.iteritems()"> 
     <a py:if="nodeProps['SubNode'] == False" href="${tg.url('/node/' + nodeId)}">${nodeProps['Name']}</a> 
     <py:if test="nodeProps['SubNode'] == True"> 
      <ul> 
      <a href="${tg.url('/node/' + nodeId)}">${nodeProps['Name']}</a> 
      </ul> 
     </py:if> 
     </li> 
    </ul> 
    </div> 
</body> 
+0

데이터 노드에 parent-> child 링크가 있거나 child-> parent 만 있습니까? 전자의 경우 재귀 적 템플릿 함수를 정의하여 확장 할 수 있지만 부모의 자식을 모두 가져 오는 쉬운 방법이 없다면 더 어려울 것입니다. – Blckknght

+0

원본 api에서 xml 구조체가 실제로 중첩되어 있으므로 부모 링크를 쉽게 추가 할 수 있습니다. 하지만 그 후에 어떻게 진행되는지 확신 할 수 없습니다. 당신은 정교 할 수 있습니까? – Sartsj

+0

'py : def'를 사용하여 노드에 대한 링크를 출력하는 "매크로"를 정의한 다음 노드에 자식이있는 경우 중첩 목록을 만들고 각 자식 노드를 렌더링하기 위해 반복적으로 자체를 호출합니다. 내 시스템에는'genshi '가 없으므로 실제로 제대로 작동 할 것이라는 답변을 만들 수는 없지만 올바른 길로 인도하기에 충분합니다. – Blckknght

답변

0

, 당신은 py:def 지시어로 만든 재귀 매크로 문제를 해결할 수 있습니다. 여기에 솔루션에서 내 시도이다 (나는 genshi 내 시스템에 설치되어 있지 않은,주의, 그래서이 안된) :

템플릿의이 부분은 두 개의 매개 변수가 전달 될 것으로 예상

<ul py:def="display_nodes(node_ids)"> 
    <li py:for="node_id in node_ids"> 
     <a href="${tg.url('/node/' + node_id)}">${nodes[node_id]['Name']}</a> 
     <py:if test="nodes[node_id]['SubNodes']"> 
      ${display_nodes(nodes[node_id]['SubNodes'])} 
     </py:if> 
    </li> 
</ul> 
${display_nodes(root_nodes)} 
,있는 nodes 사전 모든 최상위 레벨 노드의 ID를 포함하는 root_nodes 시퀀스가 ​​있습니다. 이것이 생성하는 구조는 부모의 <li> 태그에있는 자식 노드의 목록을 포함하기 때문에 링크 된 코드와 약간 다릅니다. 렌더링에 차이가 있는지 없는지 잘 모르겠지만 그렇게하는 것이 가장 올바른 것처럼 보였습니다.

+0

신난다, 고마워! 그게 더 낫고, 훨씬 효율적이고, 더 멋지게 표시하고, 백엔드에서 내 코드를 더 잘 정리하게 만들었습니다. 솔루션에 작은 오타가 하나 있습니다. py에'node_ids'를 선언하고 있습니다. : def'하지만'for' 루프에서'nodes_ids'를 사용합니다. – Sartsj

+0

도움이 된 것을 기쁘게 생각합니다. 'nodes_ids' 오타를 수정했습니다. (코드의 초안에서'nodes' 인자를 호출하는 것으로부터 잡아 당김). – Blckknght