Zenn
📃

【Movable Type】フォルダ出力に関するあれそれ

2025/02/19に公開

概要

MT(PowerCMS含む、以下同)において、ウェブページなどでフォルダを出力する際に使えるMTタグについて解説しています。

本記事の例では、フォルダを以下の階層にしています(括弧内はベースネーム)

フォルダA(folderA)
└フォルダA-1(folderA-1)
 └フォルダA-1-1(folderA-1-1)
フォルダB(folderB)
└フォルダB-1(folderB-1)
 └フォルダB-1-1(folderB-1-1)
フォルダC(folderC)
└フォルダC-1(folderC-1)
 └フォルダC-1-1(folderC-1-1)
フォルダD(folderD)

なお、フォルダ一覧やウェブページでフォルダ情報を出力する方法については、以下記事をご参考ください。

https://zenn.dev/srkkr/articles/abc7dfcdfb58e0

https://zenn.dev/srkkr/articles/de578ec8f9179c

ウェブページに指定したフォルダを出力する

ウェブページにはそれぞれひとつのフォルダしか指定できないため、複数まとめて出力するというような機能はありません。

<a href="<$mt:FolderPath$>"><$mt:FolderLabel$></a>

指定したフォルダの所属の有無で条件分岐する

指定したフォルダが、ウェブページ一覧やフォルダ一覧の出力時や、ウェブページにおいてページがそのフォルダに属しているかどうかで処理を分ける場合は、MTIfFolderを利用します。

以下の例では、「フォルダA」にのみ別途class名を振っています。

<!-- MTML -->
<mt:Folders show_empty="1">
  <mt:FolderHeader>
    <ul>
  </mt:FolderHeader>
      <li<mt:IfFolder label="フォルダA"> class="first"</mt:IfFolder>><a href="<$mt:FolderPath$>"><$mt:FolderLabel$></a></li>
  <mt:FolderFooter>
    </ul>
  </mt:FolderFooter>
</mt:Folders>

<!-- 出力結果 -->
<ul>
  <li class="first"><a href="フォルダパス">フォルダA</a></li>
  <li><a href="フォルダフォルダパス">フォルダA-1</a></li>
  <li><a href="フォルダパス">フォルダA-1-1</a></li>
  <li><a href="フォルダパス">フォルダB</a></li>
  <li><a href="フォルダパス">フォルダB-1</a></li>
  <li><a href="フォルダパス">フォルダB-1-1</a></li>
  <li><a href="フォルダパス">フォルダC</a></li>
  <li><a href="フォルダパス">フォルダC-1</a></li>
  <li><a href="フォルダパス">フォルダC-1-1</a></li>
  <li><a href="フォルダパス">フォルダD</a></li>
</ul>

カテゴリの指定は、name(公式リファレンスに記載はありませんが、labelでも動作するようです)モディファイアに値を「フォルダ名」で指定します。
なお、MTIfFolder内でMTElseの利用が可能です。

<mt:IfFolder label="フォルダA">
  <!-- フォルダAの処理 -->
<mt:Else>
  <!-- フォルダA以外での処理 -->
</mt:IfFolder>

フォルダの親フォルダを出力する

フォルダの親フォルダを出力(処理)する場合は、MTParentFolderを利用します。

以下の例では、ウェブページに次のフォルダを設定しています。

  • フォルダA-1-1
<!-- MTML -->
<mt:ParentFolder>
  <a href="<$mt:FolderPath$>"><$mt:FolderLabel$></a>
</mt:ParentFolder>

<!-- 出力結果 -->
<a href="フォルダパス">フォルダA-1</a>

また、フォルダには最上位のフォルダを出力するMTタグが用意されています。
指定したフォルダが第3階層以下の場合、最上位のフォルダを出力するには、MTTopLevelFolderを利用します(最上位のフォルダ一覧を出力するMTTopLevelFoldersと間違いやすいので注意)

以下の例では、ウェブページに次のフォルダを設定しています。

  • フォルダA-1-1
<!-- MTML -->
<mt:TopLevelFolder>
  <a href="<$mt:FolderPath$>"><$mt:FolderLabel$></a>
</mt:TopLevelFolder>

<!-- 出力結果 -->
<a href="フォルダパス">フォルダA</a>

親フォルダの存在有無で条件分岐する

フォルダに親フォルダが存在するかどうかで出力(処理)を分ける場合は、MTHasParentFolderまたはMTHasNoParentFolderを利用します。

以下の例では、親フォルダが存在する場合に別途class名を振っています。

<mt:IfFolder>
  <a href="<$mt:FolderPath$>"<mt:HasParentFolder> class="has-parent"</mt:HasParentFolder>><$mt:FolderLabel$></a>
</mt:IfFolder>

以下の例では、親フォルダが存在しない場合に別途class名を振っています。

<mt:IfFolder>
  <a href="<$mt:FolderPath$>"<mt:HasNoParentFolder> class="no-parent"</mt:HasNoParentFolder>><$mt:FolderLabel$></a>
</mt:IfFolder>

MTHasParentFolderまたはMTHasNoParentFolderタグ内ではMTElseが利用できます。

どちらを使うかは場合によりますが、以下のような状況で使い分けると、テンプレートの可読性や探しやすさ的にもよいかなと思います。

  • 親−子フォルダが多い:MTHasParentFolder
  • 親−子フォルダが少ない:MTHasNoParentFolder

サブフォルダの存在有無で条件分岐する

フォルダにサブフォルダが存在するかどうかで出力(処理)を分ける場合は、MTHasSubFoldersまたはMTHasNoSubFoldersを利用します。

以下の例では、最上位のフォルダ一覧を出力する際、サブフォルダが存在するフォルダに別途class名を振っています。

<!-- MTML -->
<mt:TopLevelFolders>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:FolderBasename$><mt:HasSubFolders> has-sub</mt:HasSubFolders>"><a href="<$mt:FolderPath$>"><$mt:FolderLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelFolders>

<!-- 出力結果 -->
<ul>
  <li class="folderA has-sub"><a href="フォルダパス">フォルダA</a></li>
  <li class="folderB has-sub"><a href="フォルダパス">フォルダB</a></li>
  <li class="folderC has-sub"><a href="フォルダパス">フォルダC</a></li>
  <li class="folderD"><a href="フォルダパス">フォルダD</a></li>
</ul>

また、以下はサブフォルダが存在しないフォルダに別途class名を振っています。

<!-- MTML -->
<mt:TopLevelFolders>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:FolderBasename$><mt:HasNoSubFolders> no-sub</mt:HasNoSubFolders>"><a href="<$mt:FolderPath$>"><$mt:FolderLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelFolders>

<!-- 出力結果 -->
<ul>
  <li class="folderA"><a href="フォルダパス">フォルダA</a></li>
  <li class="folderB"><a href="フォルダパス">フォルダB</a></li>
  <li class="folderC"><a href="フォルダパス">フォルダC</a></li>
  <li class="folderD no-sub"><a href="フォルダパス">フォルダD</a></li>
</ul>

MTHasSubFoldersまたはMTHasNoSubFoldersタグ内ではMTElseが利用できます。

最上位フォルダから現在のフォルダまでを再帰的に出力する

最上位〜現在のフォルダまでを再帰的に出力(処理)したい場合は、MTParentFoldersを利用できます(親フォルダを出力するMTParentFolderと間違えやすいので注意)
以下の例では、記事に次のフォルダを設定しています。

  • フォルダA-1-1
<!-- MTML -->
<mt:IfFolder>
  <ul>
    <mt:ParentFolders>
      <li><a href="<$mt:FolderPath$>"><$mt:FolderLabel$></a></li>
    </mt:ParentFolders>
  </ul>
</mt:IfFolder>

<!-- 出力結果 -->
<ul>
  <li><a href="フォルダパス">フォルダA</a></li>
  <li><a href="フォルダパス">フォルダA-1</a></li>
  <li><a href="フォルダパス">フォルダA-1-1</a></li>
</ul>

MTParentFoldersの中身が繰り返して処理されます。
glueモディファイアを利用でき、値に区切り文字を指定できます。値にHTMLタグを指定することも可能です。
また、exclude_current="1"を指定すると、現在のフォルダを除外して出力します。

公式リファレンス

MT

PowerCMS

Discussion

ログインするとコメントできます