Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法

Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法

Posted at October 8,2011 2:55 AM
Tag:[Category, Customize, Folder, MovableType]

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>
関連記事
zenback
人気エントリー
トラックバックURL


コメント

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>

[1] Posted by imuyam : October 11, 2011 6:20 PM

>imuyamさん
こんばんは。
ご質問の件について、すいませんが文章が理解できません。
フォーラムに投稿されているようなテキストのツリー形式で、期待する表示イメージをご連絡ください。
それではよろしくお願い致します。

[2] Posted by yujiro logo : October 13, 2011 1:50 AM

すみません、わかりづらくて。ページの構造としては以下のとおりです。
トップレベルフォルダが国名(数十個あり)で、その国の都市名をつけたサブフォルダが複数ぶらさがっています。そのなかにサブフォルダと同じ名前のウェブページがひとつずつ存在している構造になっています。ウェブページにはカスタムフィールド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がないトップレベルフォルダもすべて表示されてしまって、思うような表示になりません。お忙しいところ申し訳ありませんが、どうぞ宜しくご教授いただけると助かります。

[3] Posted by imuyam : October 15, 2011 10:26 AM

>imuyamさん
こんばんは。
ご連絡ありがとうございます。
以下のように理解しました。

・フォルダリストで、すべてのサブフォルダを非表示
・フォルダリストで、「foo」カスタムフィールドに値のあるウェブページが属するトップレベルフォルダおよびウェブページを非表示

下記のURLでエントリーしましたのでご確認ください。
http://www.koikikukan.com/archives/2011/10/16-005555.php

[4] Posted by yujiro logo : October 16, 2011 1:28 AM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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