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

先日、MTQに以下のような質問があがっていました。

あるページを閲覧中に、自分を含むTopLevelフォルダのみを表示し、そこに含まれるフォルダやページを階層的に表示できないものかと悩んでおります。

この質問に答えます。
今日は、テンプレートを組む前提として、使用するテンプレートタグをまとめます。

1.質問の概要

まず、この質問の概要をまとめます。

この質問では、以下のような出力をしたいということでした(詳しくは、元の質問の例を参照)。

  • ウェブページが属するフォルダから見て、最上位のフォルダを基点に、フォルダのツリーを出力する
  • ウェブページが属するフォルダと同じ階層のフォルダまで、ツリーで出力する
  • ウェブページが属するフォルダでは、そのフォルダに属するウェブページと、その直下の階層のフォルダを出力する

2.使用するテンプレートタグ

この質問を解決するにあたって、いくつかのテンプレートタグを組み合わせます。

2-1.ウェブページが属するフォルダを得る

まず、ウェブページが属するフォルダを調べることが必要です。
これには、「MTPageFolder」というテンプレートタグを使います。
MTPageFolderタグはブロックタグで、その中でMTFolder系のテンプレートタグを使って、フォルダの情報を出力することができます。

2-2.最上位のフォルダを得る

ウェブページが属するフォルダから見て、最上位のフォルダを得ることも必要になります。
あるフォルダから見た最上位のフォルダは、「MTTopLevelFolder」というテンプレートタグ(ブロックタグ)で出力することができます。

2-3.特定のフォルダを基点にツリーを出力する

あるフォルダを基点にして、その下の階層にあるフォルダのツリーを出力するには、「MTSubFolders」というブロックタグを使います。
基本的には、以下のようにテンプレートを組みます。

<mt:SubFolders category="基点のフォルダ名" class_type="folder" include_current="1">
  <mt:SubCatIsFirst>
    同一階層の最初のフォルダの時の出力
  </mt:SubCatIsFirst>
  フォルダの情報の出力
  <$mt:SubCatsRecurse class_type="folder"$>
  <mt:SubCatIsLast>
    同一階層の最後のフォルダの時の出力
  </mt:SubCatIsLast>
</mt:SubFolders>

上のようにテンプレートを組むと、基点のフォルダから、その下の階層にあるすべてのフォルダを出力することができます。
基点のフォルダ名として、ウェブページが属するフォルダから見た最上位のフォルダを指定すれば、その最上位のフォルダと、その下の階層のすべてのフォルダを出力することができます。

ただし、今回の質問では、ウェブページが属するフォルダと同じ階層まで出力して、そこで出力を止める必要があります。
それには、MTSubFoldersタグとMTSubCatsRecurseタグに、「max_depth="階層の深さ"」のモディファイアを付加します。

今回の質問の場合だと、max_depthモディファイアを指定するために、ウェブページが属するフォルダの階層の深さを調べることが必要になります。
階層の深さを調べるプラグインはありますが、今回はプラグインを使いたくないとのことなので、Movable Type標準のテンプレートタグで処理するようにします。