【Movable Type】フォルダ出力に関するあれそれ
概要
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)
なお、フォルダ一覧やウェブページでフォルダ情報を出力する方法については、以下記事をご参考ください。
ウェブページに指定したフォルダを出力する
ウェブページにはそれぞれひとつのフォルダしか指定できないため、複数まとめて出力するというような機能はありません。
<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
- https://www.movabletype.jp/documentation/appendices/tags/iffolder.html
- https://www.movabletype.jp/documentation/appendices/tags/parentfolder.html
- https://www.movabletype.jp/documentation/appendices/tags/toplevelfolder.html
- https://www.movabletype.jp/documentation/appendices/tags/hasparentfolder.html
- https://www.movabletype.jp/documentation/appendices/tags/hasnoparentfolder.html
- https://www.movabletype.jp/documentation/appendices/tags/hassubfolders.html
- https://www.movabletype.jp/documentation/appendices/tags/hasnosubfolders.html
- https://www.movabletype.jp/documentation/appendices/tags/parentfolders.html
PowerCMS
- https://www.powercms.jp/products/document/template-tags/iffolder.html
- https://www.powercms.jp/products/document/template-tags/parentfolder.html
- https://www.powercms.jp/products/document/template-tags/toplevelfolder.html
- https://www.powercms.jp/products/document/template-tags/hasparentfolder.html
- https://www.powercms.jp/products/document/template-tags/hassubfolders.html
- https://www.powercms.jp/products/document/template-tags/parentfolders.html
Discussion