Movable Typeのフォルダリストで特定のフォルダを表示しない方法
Movable Typeのフォルダリストで特定のフォルダ(またはフォルダ)を表示しない方法を紹介します。このカスタマイズはカテゴリにも適用可能です。
1.カスタマイズイメージ
このエントリーでは次の条件のカスタマイズを行います。
- 2階層のフォルダに1つ以上のウェブページが属する
- フォルダリストではサブフォルダを表示しない
- ウェブページのカスタムフォールドを使って、フォルダリスト上のフォルダの表示・非表示を制御
以下、具体的なカスタマイズ例です。
トップレベルフォルダが国名、サブフォルダが首都名で、サブフォルダの中にウェブページがひとつずつ入ってるフォルダリスト(カスタマイズ前)があります。
カスタマイズ前
まず、このフォルダリストからサブフォルダをすべて非表示にします。
サブフォルダを非表示
次に、各ウェブページには「foo」というカスタムフィールドがあり、fooに値を設定していない場合は、ウェブページとウェブページが属する親フォルダをすべて非表示にします。
例えば、上の一覧で「ソウル」ウェブページのfooに値が設定されていない場合、次のように「韓国」フォルダと「ソウル」ウェブページを非表示します。
特定のフォルダとウェブページを非表示
順不同リストのマークアップもvalidな内容で出力します。
2.サブフォルダを表示しないカスタマイズ
フォルダリストですべてのサブフォルダを表示しないようにするには、次のサブテンプレートを使用します。
<mt:TopLevelFolders>
<mt:SubCatIsFirst>
<mt:HasParentFolder>
<mt:else>
<ul>
</mt:HasParentFolder>
</mt:SubCatIsFirst>
<mt:HasParentFolder>
<mt:else>
<li><$mt:FolderLabel$>
</mt:HasParentFolder>
<mt:Pages>
<mt:PagesHeader>
<ul>
</mt:PagesHeader>
<li><mt:PageTitle></li>
<mt:PagesFooter>
</ul>
</mt:PagesFooter>
</mt:Pages>
<$mt:SubFolderRecurse$>
<mt:HasParentFolder>
<mt:else>
</li>
</mt:HasParentFolder>
<mt:SubCatIsLast>
<mt:HasParentFolder>
<mt:else>
</ul>
</mt:HasParentFolder>
</mt:SubCatIsLast>
</mt:TopLevelFolders>
青色の部分がサブフォルダを非表示にするための制御で、MTHasParentFolderタグで親フォルダがない場合、つまりトップレベルのフォルダのみ表示するようにしています。
3.特定のフォルダとウェブページを表示しないカスタマイズ
フォルダリストで、ウェブページのカスタムフィールド「foo」に値が入っていないフォルダとウェブページを非表示にするには、次のサブテンプレートを使用します。赤色は2項から追加した部分です。
<mt:TopLevelFolders>
<mt:Pages>
<mt:unless tag="foo">
<$mt:PageTitle setvar="pages" append="1"$>
<mt:TopLevelFolder>
<$mt:FolderLabel setvar="label"$>
<$mt:SetVar name="folders" value="$label" append="1"$>
<mt:SubFolders>
<$mt:FolderLabel setvar="label"$>
<$mt:SetVar name="folders" value="$label" append="1"$>
</mt:SubFolders>
</mt:TopLevelFolder>
</mt:unless>
</mt:Pages>
<$mt:SubFolderRecurse$>
</mt:TopLevelFolders>
<mt:TopLevelFolders>
<$mt:FolderLabel setvar="folder"$>
<mt:SubCatIsFirst>
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
<ul>
</mt:HasParentFolder>
</mt:unless>
</mt:SubCatIsFirst>
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
<li><$mt:FolderLabel$>
</mt:HasParentFolder>
</mt:unless>
<mt:unless name="folders" like="$folder">
<mt:Pages>
<mt:PagesHeader>
<ul>
</mt:PagesHeader>
<li><mt:PageTitle></li>
<mt:PagesFooter>
</ul>
</mt:PagesFooter>
</mt:Pages>
</mt:unless>
<$mt:SubFolderRecurse$>
<$mt:FolderLabel setvar="folder"$>
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
</li>
</mt:HasParentFolder>
</mt:unless>
<mt:SubCatIsLast>
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
</ul>
</mt:HasParentFolder>
</mt:unless>
</mt:SubCatIsLast>
</mt:TopLevelFolders>
4.サブテンプレートの流れ
サブテンプレートの大きな流れは次の通りです。
- 1回目のフォルダ一覧の繰り返し処理でfooに値が設定されていないウェブページをみつけ、その上位フォルダ(すべて)を変数foldersに保持。ウェブページタイトルも変数pagesに保持。
- 2回目のフォルダ一覧の繰り返し処理で、変数foldersをチェックし、該当フォルダの処理になった時点でトップレベルフォルダを表示しないよう制御
以下、ブロック別に処理を解説します。
5.フォルダ情報の取得
次のMTTopLevelFoldersタグで、1回目のフォルダ一覧の繰り返し処理を行います。
<mt:TopLevelFolders>
<mt:Pages>
<mt:unless tag="foo">
<mt:TopLevelFolder>
<$mt:FolderLabel setvar="label"$>
<$mt:SetVar name="folders" value="$label" append="1"$>
<mt:SubFolders>
<$mt:FolderLabel setvar="label"$>
<$mt:SetVar name="folders" value="$label" append="1"$>
</mt:SubFolders>
</mt:TopLevelFolder>
</mt:unless>
</mt:Pages>
<$mt:SubFolderRecurse$>
</mt:TopLevelFolders>
MTUnlessタグでfooに値がない場合のみ、MTTopLevelFolderタグでトップレベルフォルダのフォルダ名と、MTSubFoldersでその次のフォルダのフォルダ名を変数foldersに保持します。
6.ul開始タグの出力
次のMTTopLevelFoldersタグで、2回目のフォルダ一覧の繰り返し処理を行います。最初にul開始タグの出力部分から解説します。
<mt:TopLevelFolders>
<$mt:FolderLabel setvar="folder"$>
<mt:SubCatIsFirst>
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
<ul>
</mt:HasParentFolder>
</mt:unless>
</mt:SubCatIsFirst>
MTFolderLabelタグで処理中のフォルダ名を変数folderに保持します。MTSubCatIsFirstタグ内の中のMTUnlessタグで、変数folderと1回目のフォルダ一覧の繰り返し処理で設定した変数foldersを比較し、一致するフォルダ名がなければ、さらに親フォルダの有無を判定し、トップレベルフォルダであればul要素を出力します。
7.li要素の開始タグとフォルダ名の出力
次の部分でli要素の開始タグとフォルダ名の出力を行います。変数folderと変数foldersを比較し、一致するフォルダ名がなければフォルダ名を出力します。一致するフォルダ名がある場合でも、MTHasParentFolderで判定し、サブフォルダであればフォルダ名を出力します。これは「アメリカ」フォルダを出力せず、「ニューヨーク」フォルダを出力させるためです。
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
<li><$mt:FolderLabel$>
</mt:HasParentFolder>
</mt:unless>
8.ウェブページタイトル出力
ウェブページタイトルは、処理中のフォルダ(変数folder)と変数foldersを比較し、一致するフォルダ名がなければ出力します。
<mt:unless name="folders" like="$folder">
<mt:Pages>
<mt:PagesHeader>
<ul>
</mt:PagesHeader>
<li><mt:PageTitle></li>
<mt:PagesFooter>
</ul>
</mt:PagesFooter>
</mt:Pages>
</mt:unless>
9.li終了タグの出力
再帰処理用のMTSubFolderRecurseの後にli終了タグの出力制御を行っています。
<$mt:FolderLabel setvar="folder"$>
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
</li>
</mt:HasParentFolder>
</mt:unless>
先程と同様、変数folderと変数foldersを比較し、一致するフォルダ名がなければさらに親フォルダの有無を判定し、トップレベルフォルダであればli要素の終了タグを出力します。
10.ul終了タグの出力
最後にul終了タグの出力制御を行います。MTSubCatIsLastタグ内の中のMTUnlessタグで、変数folderと1回目のフォルダ一覧の繰り返し処理で設定した変数foldersを比較し、一致するフォルダ名がなければ、さらに親フォルダの有無を判定し、トップレベルフォルダであればul要素の終了タグを出力します。
<mt:SubCatIsLast>
<mt:unless name="folders" like="$folder">
<mt:HasParentFolder>
<mt:else>
</ul>
</mt:HasParentFolder>
</mt:unless>
</mt:SubCatIsLast>
</mt:TopLevelFolders>
11.サブフォルダを出力したい場合
3項のサブテンプレートは、2項の「サブフォルダを出力しないカスタマイズ」を含んでます。
「特定のフォルダとウェブページは表示したくないけど、表示するフォルダについてはサブフォルダも出力したい」という場合は、3項のサブテンプレートから青色のタグをすべて除去してください。
- サイトマップを作る for Movable Type 4