Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法
Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法を紹介します。
1.カスタマイズイメージ
トップレベルフォルダが国名、サブフォルダが首都名で、サブフォルダの中にウェブページがひとつずつ入ってるフォルダ一覧(カスタマイズ前)があります。
カスタマイズ前
各ウェブページにはfooというカスタムフィールドがあり、fooに値を設定していない場合は、このフォルダ一覧でウェブページが属するトップレベルフォルダを表示しません。
例えば、「ニューヨークウェブページ」と「ソウルウェブページ」のfooに値が設定されていない場合、次のように「アメリカ」と「韓国」というトップレベルフォルダを非表示します。
カスタマイズ後
順不同リストのマークアップもvalidな内容で出力します。
2.カスタマイズ
1項のカスタマイズを行うには次のサブテンプレートを使用します。ベストプラクティスではないかもしれませんが予めご容赦ください。
<$mt:SetVar name="counter" value="0"$>
<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:SetVar name="counter" op="++"$>
</mt:TopLevelFolders>
<$mt:GetVar name="counter" setvar="max"$>
<mt:TopLevelFolders>
<$mt:FolderLabel setvar="folder"$>
<mt:SubCatIsFirst>
<mt:unless name="folders" like="$folder">
<ul>
<mt:else>
<mt:if name="max" eq="$counter">
<mt:HasParentFolder>
<ul>
</mt:HasParentFolder>
</mt:if>
</mt:unless>
</mt:SubCatIsFirst>
<mt:unless name="folders" like="$folder">
<li><$mt:FolderLabel$>
<mt:else>
<mt:HasParentFolder>
<li><$mt:FolderLabel$>
</mt:HasParentFolder>
</mt:unless>
<mt:Pages>
<mt:PagesHeader>
<ul>
</mt:PagesHeader>
<li><mt:PageTitle></li>
<mt:PagesFooter>
</ul>
</mt:PagesFooter>
</mt:Pages>
<$mt:SubFolderRecurse$>
<$mt:SetVar name="counter" op="--"$>
<$mt:FolderLabel setvar="folder"$>
<mt:unless name="folders" like="$folder">
</li>
<mt:else>
<mt:HasParentFolder>
</li>
</mt:HasParentFolder>
</mt:unless>
<mt:SubCatIsLast>
<mt:unless name="folders" like="$folder">
</ul>
<mt:else>
<mt:unless name="counter">
</ul>
</mt:unless>
</mt:unless>
</mt:SubCatIsLast>
</mt:TopLevelFolders>
3.サブテンプレートの流れ
サブテンプレートの大きな流れは次の通りです。
- 1回目のフォルダ一覧の繰り返し処理でfooに値が設定されていないウェブページをみつけ、その上位フォルダ(すべて)を変数foldersに保持
- 2回目のフォルダ一覧の繰り返し処理で変数foldersをチェックし、該当フォルダの処理になった時点でトップレベルフォルダを表示しないよう制御
苦労したのは、トップレベルフォルダを非表示にしたときに、関連するul要素の数をあわせる部分です。非表示のトップレベルフォルダが順不同リストの先頭の場合はul開始タグを表示し、非表示のトップレベルフォルダが順不同リストの最後の場合、ul終了タグを表示する必要があります。
文章では分かりにくいので、順不同リストで示します。
次のマークアップは非表示のトップレベルフォルダが順不同リストの先頭の場合です。単純な制御では赤色の部分が表示されません。
<ul>
<li>ソウル
<ul>
<li>ソウルウェブページ</li>
</ul>
</li>
<li>日本
<ul>
<li>東京
<ul>
<li>東京ウェブページ</li>
</ul>
</li>
</ul>
</li>
</ul>
非表示のトップレベルフォルダが順不同リストの最後の場合です。単純な制御では赤色の部分が表示されません。
<ul>
<li>日本
<ul>
<li>東京
<ul>
<li>東京ウェブページ</li>
</ul>
</li>
</ul>
</li>
<li>ソウル
<ul>
<li>ソウルウェブページ</li>
</ul>
</li>
</ul>
以下、ブロック別に処理を解説します。
4.フォルダ情報の取得
次のMTTopLevelFoldersタグで、1回目のフォルダ一覧の繰り返し処理を行います。
<$mt:SetVar name="counter" value="0"$>
<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:SetVar name="counter" op="++"$>
</mt:TopLevelFolders>
MTUnlessタグでfooに値がない場合のみ、MTTopLevelFolderタグでトップレベルフォルダのフォルダ名と、MTSubFoldersでその次のフォルダのフォルダ名を変数foldersに保持します。
先頭のMTSetVarタグで扱っている変数counterは、すべてのフォルダ数をカウントするためのものです。
5.ul開始タグの出力
次のMTTopLevelFoldersタグで、2回目のフォルダ一覧の繰り返し処理を行います。最初にul開始タグの出力部分から解説します。
<$mt:GetVar name="counter" setvar="max"$>
<mt:TopLevelFolders>
<$mt:FolderLabel setvar="folder"$>
<mt:SubCatIsFirst>
<mt:unless name="folders" like="$folder">
<ul>
<mt:else>
<mt:if name="max" eq="$counter">
<mt:HasParentFolder>
<ul>
</mt:HasParentFolder>
</mt:if>
</mt:unless>
</mt:SubCatIsFirst>
まず、変数counterを変数maxに保持します(変数counterは繰り返し処理内で減算させるため)。
MTFolderLabelタグで処理中のフォルダ名を変数folderに保持します。MTSubCatIsFirstタグ内の中のMTUnlessタグで、変数folderと1回目のフォルダ一覧の繰り返し処理で設定した変数foldersを比較し、一致するフォルダ名がなければul要素を出力します。
一致するフォルダ名がある場合は、さらにMTIfタグでフォルダ数の最大値であることを比較し、値が等しければ順不同リストの初回処理とみなしてul要素を出力します。MTHasParentFolderタグで括っているのはul要素を重複して出力させないためです。
6.li要素の開始タグとフォルダ名の出力
次の部分でli要素の開始タグとフォルダ名の出力を行います。変数folderと変数foldersを比較し、一致するフォルダ名がなければフォルダ名を出力します。一致するフォルダ名がある場合でも、MTHasParentFolderで判定し、サブフォルダであればフォルダ名を出力します。これは「アメリカ」フォルダを出力せず、「ニューヨーク」フォルダを出力させるためです。
<mt:unless name="folders" like="$folder">
<li><$mt:FolderLabel$>
<mt:else>
<mt:HasParentFolder>
<li><$mt:FolderLabel$>
</mt:HasParentFolder>
</mt:unless>
7.ウェブページタイトル出力
ウェブページタイトルの出力は、特筆すべきことはありません。
<mt:Pages>
<mt:PagesHeader>
<ul>
</mt:PagesHeader>
<li><mt:PageTitle></li>
<mt:PagesFooter>
</ul>
</mt:PagesFooter>
</mt:Pages>
8.li終了タグの出力
再帰処理用のMTSubFolderRecurseの後に変数counterの減算処理をいれてます。その後li終了タグの出力制御を行っています。
<$mt:SubFolderRecurse$>
<$mt:SetVar name="counter" op="--"$>
<$mt:FolderLabel setvar="folder"$>
<mt:unless name="folders" like="$folder">
</li>
<mt:else>
<mt:HasParentFolder>
</li>
</mt:HasParentFolder>
</mt:unless>
先程と同様、変数folderと変数foldersを比較し、一致するフォルダ名がなければli要素の終了タグを出力します。一致するフォルダ名がある場合でも、MTHasParentFolderで判定し、サブフォルダであればli要素の終了タグを出力します。これはさきほどの「アメリカ」フォルダを出力せず、「ニューヨーク」フォルダを出力させるための制御で、li要素の開始タグに対応する終了タグを出力させるためです。
9.ul終了タグの出力
最後にul終了タグの出力制御を行います。MTSubCatIsLastタグ内の中のMTUnlessタグで、変数folderと1回目のフォルダ一覧の繰り返し処理で設定した変数foldersを比較し、一致するフォルダ名がなければul要素の終了タグを出力します。
一致するフォルダ名がある場合は、さらにMTUnlessタグでフォルダ数が「0」であることを判定し、「0」であれば順不同リストの最後の処理とみなしてul要素の終了タグを出力します。
<mt:SubCatIsLast>
<mt:unless name="folders" like="$folder">
</ul>
<mt:else>
<mt:unless name="counter">
</ul>
</mt:unless>
</mt:unless>
</mt:SubCatIsLast>
</mt:TopLevelFolders>
- Movable Type6で記事のない親カテゴリのカテゴリページを出力する方法
- Movable Typeでブログ記事が属するカテゴリアーカイブのリンクをブログ記事ページに表示する
- Movable Typeで「カテゴリ+年別」の記事一覧を表示する方法
- Movable Typeで親カテゴリーアーカイブに表示した記事のメインカテゴリまでのパンくずリストを表示する
- Movable Typeのカテゴリのベースネームについて
- Movable Typeで複数ブログのブログ記事を同名のカテゴリ別に振り分ける方法
- Movable TypeのMTIfCategoryタグとMTEntryIfCategoryタグの違い
- Movable Typeのカテゴリリストで階層別に背景画像を変更する
- Movable Typeのカテゴリリストにダミーの親カテゴリを表示する
- MTEntriesタグのcategoryモディファイアに「AND」を含むカテゴリを指定する
- ブログ記事ページに自分が属するカテゴリのツリーと直属カテゴリの他のブログ記事一覧を表示する
- Movable Type 5でのMTEntriesタグのcategory/catgoriesモディファイアの動作改善について
- 親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする
- 特定のカテゴリのブログ記事を表示する
- 親カテゴリページにサブカテゴリページのリンクを表示する
yujiro様、MTQにこの質問をさせていただいたimuyamです。別エントリーまで立てていただいてありがとうございます。
しかしながら、悲しいかな。実力不足で理解できず、自分のものにアレンジでません・・・(泣
ページでは、サブフォルダはソート用として使用しているだけで、どっちにしても表示させないようなつくりにしています。なのでトップレベルフォルダ名とウェブページに設置してるカスタムフィールドだけが表示される、もしくは両方とも表示されないというつくりにしたいのですが・・・(今はカスタムフィールドの値がないフィリピンやベトナムも国名であるトップレベルフォルダが表示されてる状態)
<mtSortedTopLevelFolders>
<h3><$mtFolderLabel$></h3>
<ul class="dwlListList"><mtSortedSubFolders><$MT:SubFolderRecurse$><mtPages><mt:If tag="foo"><li><a href="#"><mt:foo></a></li></mt:If></mtPages>
</mtSortedSubFolders></ul>
</mtSortedTopLevelFolders>
>imuyamさん
こんばんは。
ご質問の件について、すいませんが文章が理解できません。
フォーラムに投稿されているようなテキストのツリー形式で、期待する表示イメージをご連絡ください。
それではよろしくお願い致します。
すみません、わかりづらくて。ページの構造としては以下のとおりです。
トップレベルフォルダが国名(数十個あり)で、その国の都市名をつけたサブフォルダが複数ぶらさがっています。そのなかにサブフォルダと同じ名前のウェブページがひとつずつ存在している構造になっています。ウェブページにはカスタムフィールドfooを表示するようにしています。
|ー日本
|ー東京
|ー東京ウェブページ(foo)
|ー大阪
|ー大阪ウェブページ(foo)
|ー福岡
|ー福岡ウェブページ(foo)
|ー韓国
|ーソウル
|ーソウルウェブページ(foo)
|ー釜山
|ー釜山ウェブページ(foo)
|ー中国
|ー北京
|ー北京ウェブページ(foo)
|ーマレーシア
|ーイポー
|ーイポーウェブページ(foo)
しかし、サブフォルダは別のページで別の用途のためにつくったものであり、今回のページでは見た目上必要としていません。このページではトップレベルフォルダとfooの値のみを表示させたいので、以下のような見た目になるようにしています。
|ー日本
|ー東京ウェブページ(foo)
|ー大阪ウェブページ(foo)
|ー福岡ウェブページ(foo)
|ー韓国
|ーソウルウェブページ(foo)
|ー釜山ウェブページ(foo)
|ー中国
|ー北京ウェブページ(foo)
|ーマレーシア
|ーイポーウェブページ(foo)
しかし、自分のやり方ではfooに値が入っていても入っていなくてもトップレベルフォルダが表示されてしまいます。そうすると何も情報がないトップレベルフォルダが以下のように意味なく表示されてしまうことになり、見た目上よろしくありません。(例えば北京、イポーにfooの値がない場合でも中国、マレーシアが表示されてしまいます)
|ー日本
|ー東京ウェブページ(foo)
|ー福岡ウェブページ(foo)
|ー韓国
|ー釜山ウェブページ(foo)
|ー中国
|ーマレーシア
そこで、以下のようにfooが入っているページを有するトップレベルフォルダのみを表示させ、fooが入っていないページのトップレベルフォルダは表示させないようにしたいのです。
|ー日本
|ー東京ウェブページ(foo)
|ー福岡ウェブページ(foo)
|ー韓国
|ー釜山ウェブページ(foo)
教えていただいたコードでやってみたのですが、fooがないトップレベルフォルダもすべて表示されてしまって、思うような表示になりません。お忙しいところ申し訳ありませんが、どうぞ宜しくご教授いただけると助かります。
>imuyamさん
こんばんは。
ご連絡ありがとうございます。
以下のように理解しました。
・フォルダリストで、すべてのサブフォルダを非表示
・フォルダリストで、「foo」カスタムフィールドに値のあるウェブページが属するトップレベルフォルダおよびウェブページを非表示
下記のURLでエントリーしましたのでご確認ください。
http://www.koikikukan.com/archives/2011/10/16-005555.php