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

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

Posted at October 16,2011 12:55 AM
Tag:[Category, Customize, Folder, MovableType]

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

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)