TopMovable Typeカスタマイズカテゴリー > 2011年10月
2011年10月16日

Movable Typeのフォルダリストで特定のフォルダを表示しない方法

October 16,2011 12:55 AM
Tag:[, , , ]
Permalink

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項のサブテンプレートから青色のタグをすべて除去してください。

Comments [0] | Trackbacks [0]
2011年10月 8日

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>
Comments [4] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3