ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則
ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則 - WolaWolaWolaWolaの中の人であるoscarさんに、わたしが以前書いた「MT4.1:カテゴリの並べ替え(カスタムフィールド+ハッシュ変数)」という記事の紹介をいただきました。
実はoscarさんはあのMP4LP5イベントの連動書籍ともなる『Movable Typeプロフェッショナル・スタイル』の執筆者のお一人でして、わたしごときアル中で近眼で寝不足な男が対等に話をするのも恐れ多いのですが...アワワ
紹介記事の中で、「続き書かない?」というリクエストをいただいたので、少し乗ってみます。
これなのですが、カスタムフィールドとハッシュを使用した、ノープラグインでのカテゴリ並べ替えのテクニックを、さらにサブカテゴリ対応にまで拡張させたサンプルなのですが、結構いいアイデアが適用されています。まずは、ソース。
oscar氏による改造コード
<MTIfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
<h3 class="widget-header">カテゴリ</h3>
<div class="widget-content">
<$MTSetVar name="nestlevel" value="0"$>
<MTTopLevelCategories>
<$MTCategorySortOrder setvar="catsort"$>
<MTSubCatIsFirst><$MTSetVar name="nestlevel" op="++"$></MTSubCatIsFirst>
<MTSetVarBlock name="catlevel[$catsort]"><$MTVar name="nestlevel"$></MTSetVarBlock>
<MTSetVarBlock name="catlinkset" index="$catsort"><MTIfNonZero tag="CategoryCount">
<a href="<$MTCategoryArchiveLink$>"<MTIfNonEmpty tag="CategoryDescription"> title="<$MTCategoryDescription$>"</MTIfNonEmpty>><$MTCategoryLabel$> (<$MTCategoryCount$>)</a><MTElse><$MTCategoryLabel$></MTIfNonZero>
</MTSetVarBlock>
<MTSetHashVar name="loopcategory"><$MTSetVar name="$catsort" value="$catlinkset[$catsort]"></MTSetHashVar>
<$MTSubCatsRecurse$>
<MTSubCatIsLast><$MTSetVar name="nestlevel" op="--"$></MTSubCatIsLast>
</MTTopLevelCategories>
<ul class="widget-list"><li class="widget-list-item">
<$MTSetVar name="prev_catlevel" value="1"$>
<MTLoop name="loopcategory" sort_by="key">
<MTSetVarBlock name="mvlevel"><$MTVar name="catlevel[$__key__]"$></MTSetVarBlock><$MTSetVar name="mvlevel" value="$prev_catlevel" op="-"$><MTIf name="prev_catlevel" ne="-1"><MTIf name="mvlevel" gt="0"><ul class="widget-list"><li class="widget-list-item"><MTElseIf name="mvlevel" lt="0"></li></ul></li>
<li class="widget-list-item"><MTElseIf name="mvlevel" eq="0"></li>
<li class="widget-list-item"></MTIf></MTIf><$MTVar name="catlinkset[$__key__]"$><MTSetVarBlock name="prev_catlevel"><$MTVar name="catlevel[$__key__]"$></MTSetVarBlock>
</MTLoop>
<MTIf name="prev_catlevel" gt="1"></li></ul></MTIf>
</li></ul>
</div>
</div>
</MTIfArchiveTypeEnabled>
発見した点とか
まず、カテゴリリストを扱うブロックがMTTopLevelCategoriesブロックタグに変更され、再帰的にサブカテゴリを取得するように拡張されています。MTSubCatIsFirstでネストのレベルをインクリメント、MTSubCatIsLastでネストのレベルをデクリメントされています。なるほど!これはカッコええデス。
MTTopLevelCategoriesブロックタグでリストをハッシュで生成し、のちにMTLoopでリンクまで含んだカテゴリリストのコードを吐き出させています。このサンプルでは子カテゴリまでの対応です。
私が最初に作ったサンプルでは、カスタムフィールドの「ソートオーダー」の値をもし入れ間違って、同じ数値であったり、デフォルトの「0000」であったりするとデータが上書きされるという難点がありましたが、これもそのままです。しかしこれは変に凝らずにそのような仕様としてしまうのがいいと思います。時間は有限だし...
今後の課題など
「孫カテゴリ、ひ孫カテゴリまで表示できるようにする」これでしょう。実は少しやってみました。しかし、MTのテンプレートタグでは「これがやりたかったんだよな」ということができない場合があり、時間もないので断念してしまいました。
ハッシュのキーにデータが複数持てればそれでできそうな気もするんです。それと関数再帰コールのようなことがやりたいのですが(階層はプログラミング完了時にはどこまであるかがわからないため、フォルダ関係のプログラムでは再帰処理を使用する)、一体どうすればいいのかがわからない。MTSetVarTemplate使えばいいんだろうか?
目線を変えて、MTTopLevelCategoriesブロックのループ中に、文字列変数へappend="1"モデファイアでデータを作ってしまうか!とも考えましたが、そもそもMTTopLevelCategoriesなどでどう並びが変わってしまうのかが予測できないので、それもボツっぽい。
あと、カスタムフィールドが使用できないMTOS(ですよね?)向きに、他のタイプのコードを考えねばいけないと思っています。なので、この手法は、サブ・サブサブカテゴリ完全対応にまで昇華させるのか、あるいはフラットなカテゴリまで限定にしておき、他の手法を考えるかどうかの分岐点にいます。
忙しく記事を書いている途中にこのエントリ書きました...中途半端で、しかもとっ散らかった内容ですみません。
- カテゴリ:211Movable Type4
トラックバック(0)
このブログ記事を参照しているブログ一覧: ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則
このブログ記事に対するトラックバックURL:
- Categories
- Entries
-
- MT4:エントリ投稿画面をホゲる実験
- MT4LP5で得たもの
- MT4LP5に参加しました
- MT4.1:mtde.info 開設しました。
- Movable Type4で、かなり気に入っていること
- Movable Type4で、かなり気に入らないこと
- MT4.1:CustomEditorButton2 プラグイン
- MT4.1:「テンプレートの編集」画面のコードスニペットを拡張する
- MT4.1:自サイト・他サイトのFeed情報を取得してリスト化(続編)
- 日記(K0、mtde、MT)
- MT4.1:自サイト・他サイトのFeed情報を取得してリスト化
- ノープラグインでカテゴリーソート(MT4.1専用版)多分に反則
- 自サイト内の特定カテゴリのRSSを出力
- MT4.1:モジュール化(雑談ですが)
- MT4.1:カテゴリリストへ代表画像を付与する(Asset系)
- MT4.1:カテゴリリスト+エントリ全展開+エントリのAsset代表画像表示
- MT4.1:イメージの幅指定で高さを自動的に計算(Asset系)
- MT4.1:MTでサポートされない演算をJavaScript関数ライブラリ化する
- MT4.1:エントリと同じタグのついた他エントリをリストアップする(自エントリを強調表示・改良版)
- エントリと同じタグのついた他エントリをリストアップする(自エントリを強調表示)
- 最新記事で使用されているタグの最新5件を表示
- MT4.1:エントリリストへ、特定カテゴリ用画像をつける
- MT4LP5
- MT4.1で乱数を取得したい場合
- ★マークでエントリ数を示すエントリリストつきカレンダー
- 横型カレンダー(素ノーマル)
- ファンキーな横置きカレンダー
- サムネイル画像エントリリストの改造(MT4.1用)
- MT4.1 ついにリリース
- 日記
- MT4.1:変数2つでの演算 (2)
- MT4.1:テンプレートタグで100までの数から素数を求める
- MT4.1:変数2つでの演算
- 日記
- MT4.1:年度タイトルつき月別アーカイブ(4月で新年度切り替え)
- MT4.1:年タイトルつき月別アーカイブ(1月で新年切り替え)
- 全カテゴリからエントリを3件ずつ表示する。キメウチ禁止
- MT4.1:カテゴリの並べ替え+表示切り替え+現カテゴリ展開+強調表示つき(カスタムフィールド+ハッシュ変数)
- MT4.1:カテゴリの並べ替え+表示切り替え(カスタムフィールド+ハッシュ変数)
- MT4.1:カテゴリの並べ替え(カスタムフィールド+ハッシュ変数)
- 日記
- MT4.1:文字列を繋げる
- MT4.1:カテゴリの並べ替え(プラグイン使わず)
- エントリと同じタグのついた記事一覧をリストアップ(3)
- あるエントリの存在するカテゴリの、サブカテゴリ内のエントリを抽出する
- 配列に対するpopとshift
- MTのテンプレートタグでFizzBuzz。
- エントリと同じカテゴリ内のエントリ一覧取得
- MT4.1:Forループ(文字列の連結)
- MT4.1:Forループ(配列中より特定のデータのインデックスを取得)
- MT4.1:Forループ(配列の並びを逆にする)
- MT4.1:Loopループ(基本形)
- MT4.1:Forループ(基本形)
- MT4.1:配列サンプル(配列の先頭・末尾からデータ取得・削除)
- MT4.1:配列サンプル(特定カテゴリの全エントリのみを配列へ代入)
- MT4.1:配列サンプル(全カテゴリを配列へ代入)
- 外部ブログのRSSを自サイトへ読み込み
- 名無しコメントに対応する
- 複数カテゴリの最新情報5件(例2)
- 複数カテゴリの最新情報5件(例1)
- カテゴリごとの表示形態を変える(多カテゴリ対応)
- 特定のカテゴリの最新エントリ5件をメインページへ表示
- 変数専用モジュールで取得したカテゴリ情報配列をほかのモジュールで使用する
- 定数・変数専用のモジュールを使う
- タグ名の全取得、配列へセット、生成文字列連結
- カテゴリ名の全取得、配列へセットする
- サムネイル画像エントリリストの改造(さらにチューン)
- サムネイル画像エントリリストの改造(OK版)
- サムネイル画像エントリリストの改造
- MT4のコメントフォーム
- 配列使ってみたテスト
- ブログ記事投稿時のタグ・キーワードとか
- 実験記事:キーワードのつけ方と概要の書き方
- デザイン小変更
- MT4書籍購入
- MT4で日本語を用いたタグクラウドがおかしい・~が出ない問題点
- 小粋な本の購入
- ちょっと気づいたこと
- MTSetVarでクリッカブルマップ
- 画像サムネイルエントリリスト(改)
- MTGetVarによるアンカーリンク
- MT3>MT4バージョンアップ時不具合
- pageを用いたナビゲーションバー
- 画像の取り扱い
- MT3サイトをMT4サイトへコンバート
- 月別アーカイブのタイトルが0000年12月となる不具合
- MT4で、エントリが再構築されないとき
- MTGetVarで文字列置換
- エントリと同じタグのついた記事一覧をリストアップ(2)
- 同一カテゴリーに属するエントリ一覧
- Folderの親子関係を調べる
- FolderLabel・FolderDescription関係調査
- カテゴリ・エントリリスト(改)
- カテゴリ・エントリリスト
- folder調査用テンプレート(1)
- トップレベルのウェブページのみ抜き出す
- ドロップダウンタグリスト
- Feed情報調査用テンプレート
- MTEntryCreatedDate
- コメント調査用テンプレート
- カテゴリ数、エントリ数、ウェブページ数の取得
- strip_tagsモデファイア
- replaceモデファイア
- regex_replaceモデファイア
- count_paragraphsモデファイア
- count_charactersモデファイア
- catモデファイア
- count_wordsモデファイア
- MTAuthor関連調査
- 画像サムネイルエントリリスト
- MTAsset関連調査(2)
- MTAsset関連調査
- カテゴリ毎に表示を変えるには?
- 強調表示付きカテゴリリスト
- MT4ライセンス購入
- MT4:Webページで生成するグローバルナヴィゲーション
- MT4:エントリと同じタグのついた記事一覧をリストアップ
- MT4:テンプレート構想変更
- MT4:beta7の生成xhtmlコード解析、ほか
- MT4:うっかりやってはいけないこと
- MT4:スタイルシートの切り替え
- MT4:モジュール化成果
- MT4:モジュール化・アルファ(本文)エリアの改造
- MT4:モジュール化・システムテンプレート
- MT4:モジュール化・ウェブページ
- MT4:モジュール化・エントリアーカイブページ
- MT4:モジュール化・カテゴリアーカイブページ
- MT4:モジュール化・アルファ(本文)エリア
- MT4:エントリについて
- MT4:モジュール化・バナーエリア
- MT4:モジュール化・ヘッダコード
- MT4:モジュール化・モジュール名の命名規則
- MT4:モジュール化・基本形改造
- MT4:XML宣言モジュール
- MT4:モジュール化・基本形
- MT4:カテゴリソート(MTCategoryLabel remove_html="1")

コメント(2)
oscar (2008年2月16日 20:00)
こんにちは、yoshiさん。
>MTのテンプレートタグでは「これがやりたかったんだよな」ということができない場合があり、時間もないので断念してしまいました。
やっぱり、これに尽きますね。
ちなみにこのコードで孫以下に対応するには、
<MTElseIf name="mvlevel" lt="0">の中で、$mvlevelがゼロになるまでループして、「</li></ul>」を書きだして行けば良いんじゃないかと思う。
実は$mvlevelって1以上にはならないんだよねぇ。だからマイナスの時だけうまく処理出来れば、いけると思ってます。
yoshi (2008年2月16日 21:31)
oscarさんこんにちは
時間を幾らかけてもいいのであればできそうなんですけどね...
>「」を書きだして行けば良いんじゃないかと思う。
そうですね、結局、階層を表現するのがul、liならば、ネストごとにそれを付け足すということは私も考えました。私が考えていたのは、MTSetVarTemplateタグを用いた再帰処理でそれを実現する、という案ですが。
これは時間ができたらやってみようと思っています。
また、私は、カスタムフィールドさえ使わずに同じことが実現できると、カナリ素敵と思います。
コメントする