フォルダの階層構造を部分的に出力する(その2)

昨日の続きで、フォルダの階層構造を部分的に出力する方法を解説します。
今日は、実際のテンプレートの内容を解説します。

1.ウェブページが属するフォルダの情報を得る

まず、ウェブページが属するフォルダについて、以下の各情報を得ます。

  • フォルダの階層の深さ
  • そのフォルダから見た最上位フォルダの名前
  • フォルダのID

フォルダの階層の深さと、そのフォルダから見た最上位フォルダの名前は、フォルダのツリーを出力する際に使います。
また、フォルダのIDは、そのフォルダに属するウェブページとサブフォルダの一覧を出力する際に使います。

ここまでのテンプレートは以下のようになります。

<mt:PageFolder>
  <$mt:SetVar name="page_folder_depth" value="0"$>
  <$mt:FolderID setvar="page_folder_id"$>
  <mt:ParentFolders>
    <$mt:SetVar name="page_folder_depth" op="++"$>
  </mt:ParentFolders>
  <mt:TopLevelFolder>
    <$mt:FolderLabel setvar="top_folder"$>
  </mt:TopLevelFolder>
</mt:PageFolder>

テンプレートの内容は以下の通りです。

1-1.1/10行目

ウェブページが属するフォルダについて、ブロック内を処理します。

1-2.2行目

変数page_folder_depthの値を0にします。
この変数に、フォルダの階層の深さを求めます。

1-3.3行目

ウェブページが属するフォルダのIDを、変数page_folder_idに代入します。

1-4.4~6行目

MTParentFoldersタグを使って、ウェブページが属するフォルダについて、最上位フォルダからそのフォルダまでを順に繰り返します。
繰り返しの中では、変数page_folder_depthの値を1ずつ増やします。
これによって、繰り返しが終わると、変数page_folder_depthにフォルダの階層の深さが求められます。

1-5.7~9行目

MTTopLevelParentFolderタグを使って、ウェブページが属するフォルダについて、そこから見た最上位フォルダを得ます。
そして、8行目のMTFolderLabelタグで、最上位フォルダの名前を変数top_folderに代入します。

2.フォルダ一覧の出力

次に、ここまでで得た情報を元に、フォルダの一覧を出力します。
そのテンプレートは以下のようになります。

<$mt:PageID setvar="page_id"$>
<$mt:SetVar name="page_folder_depth" op="--"$>
<mt:SubFolders category="$top_folder" class_type="folder" include_current="1" max_depth="$page_folder_depth">
  <mt:SubCatIsFirst><ul></mt:SubCatIsFirst>
  <li><$mt:FolderLabel$>
  <$mt:SubCatsRecurse class_type="folder" max_depth="$page_folder_depth"$>
  <mt:If tag="FolderID" eq="$page_folder_id">
    <ul>
    <mt:Pages>
      <mt:If tag="PageID" eq="$page_id">
        <li class="current"><$mt:PageTitle$></li>
      <mt:Else>
        <li><a href="<$mt:PagePermalink$>"><$mt:PageTitle$></a></li>
      </mt:If>
    </mt:Pages>
    <mt:SubFolders class_type="folder" >
      <li><$mt:FolderLabel$></li>
    </mt:SubFolders>
    </ul>
  </mt:If>
  </li>
  <mt:SubCatIsLast></ul></mt:SubCatIsLast>
</mt:SubFolders>

テンプレートの内容は以下の通りです。

2-1.1行目

ウェブページのIDを、変数page_idに代入します。
この変数は、ツリーに同一フォルダ内のウェブページの一覧を出力する際に、自分自身を出力しているかどうかを判断するために使います。

2-2.2行目

今回の例では、MTSubFoldersタグのmax_depthモディファイアに、変数page_folder_depthの値を指定します。
今の時点では、この値は最上位フォルダから数えた階層の深さになっています。

しかし、MTSubFoldersタグにcategoryモディファイアとinclude_currentモディファイアを付加した場合、max_depthモディファイアは、categoryモディファイアで指定したフォルダの下の階層を1階層目として数えます。
そのため、「max_depth="$page_folder_depth"」として、変数page_folder_depthの値をそのまま指定すると、1階層深く出力してしまうことになります。
そこで、変数page_folder_depthの値を1減らします。

2-3.3/23行目

MTSubFoldersタグを使って、ウェブページが属するフォルダから見た最上位フォルダを基点に、フォルダのツリーを順に出力します。

2-4.4行目

同一階層の最初のフォルダの時には、<ul>タグを出力します。

2-5.5行目

<li>タグとフォルダ名を出力します。

2-6.6行目

フォルダの階層を1つ下って、MTSubFoldersタグのブロック内を繰り返します。
ただし、MTSubFoldersタグとMTSubCatsRecurseタグにmax_depthモディファイアを指定しているので、ウェブページが属するフォルダより下の階層には下りません。

2-7.7/20行目

現在処理中のフォルダのID(MTFolderIDタグ)と、ウェブページが属するフォルダのID(変数page_folder_id)を比較します。
そして、両者が一致していれば(現在処理中のフォルダがウェブページの属するフォルダであれば)、ブロックの中に進み、そのフォルダに属するウェブページとサブフォルダの一覧を出力します。

2-8.9/15行目

再構築中のウェブページと同じフォルダに属するウェブページを順に出力します。

2-9.10/12/14行目

MTPagesタグで現在出力中のウェブページのID(MTPageIDタグ)と、再構築中のウェブページのID(変数page_id)を比較します。

2-10.11行目

再構築中のページをリストに出力する場合は、li要素に「current」というクラスを付けて、ページのタイトルだけ出力します。

2-11.13行目

再構築中以外のページをリストに出力する場合は、そのページへのリンクを出力します。

2-12.16~18行目

再構築中のウェブページが属するフォルダのサブフォルダを出力します。