カテゴリやフォルダをユーザの好きなようにソートするプラグイン、SortableCategoriesを作りました。
SortableCategories - ogawa - A plugin for realizing Sortable Categories and Folders. - Google Code
同様の目的のプラグインがいくつかありますが、SortableCategoriesが特徴的なのは以下の点です。
- Drop & Drop操作でのカテゴリーツリーの編集の実現。script.aculo.usのSortableツリーを利用しています。
- 最小限のコンストラクトのみでの実現。このプラグインでは、新しいブロックタグやファンクションタグを一切導入しません。言い換えると、できることは限られていますが「これで十分」。
カテゴリツリーを編集するには
- まず、「カテゴリの管理」に行きます(「一覧」ドロップダウンメニューから「カテゴリ」を選択します)。
- 「カテゴリの管理」の右側に「カテゴリツリーの管理」というリンクが表示されているので、クリックします。
- 「カテゴリツリーの管理」画面では、カテゴリツリーを好きなように編集できます。カテゴリまたはサブツリーをつかんで適当な場所に移動させることができます。
- 思う存分編集したら「保存」ボタンをクリックすることで現在のツリーの状態を保存することができます。
フォルダツリーも同様にして編集できます。
カテゴリツリーを出力するには
えーと、まずいろいろ誤解があると思うので整理しておきますが、MTのカテゴリ関連のタグ(全37個)は、カテゴリリストに関わるものと、カテゴリツリーに関わるもの、それ以外のものの三種類に分類できます。
SortableCategoriesは順序付きのカテゴリツリーを操作するツールなのですから、関係あるのはカテゴリーツリーに関連するものだけです。このクラスに分類できるタグをざっと挙げると、SubCatIsFirst, SubCatIsLast, HasSubCategories, HasNoSubCategories, HasParentCategory, HasNoParentCategory, IfIsAncestor, IfIsDescendant, SubCategories, TopLevelCategories, ParentCategory, ParentCategories, TopLevelParent, SubCatsRecurse, SubCategoryPathの15個。
このうち、カテゴリツリーのノードの出現順に関係するものとなると、SubCatIsFirst, SubCatIsLast, SubCategories, TopLevelCategories, SubCatsRecurseの5個だけ。
さらに、SubCatIsFirst, SubCatIsLastが使えるのはSubCatsRecurseの中だけですし、TopLevelCategoriesはSubCategoriesにtop="1"という引数を渡しただけのシンタクティックシュガーでしかありません。つまり、SubCategoriesとSubCatsRecurseだけ何とかすればいいわけです(37→15→5→2)。
好都合なことにSubCategoriesにはsort_methodというオプションがあり、カテゴリの階層ごとにカテゴリリストをソートするPerlのメソッドを指定できるようになっています。
つまりは適切なメソッドだけプラグインで提供してやれば用は足りるってことです。それ以外のユーザ定義タグは一切不要だってことです。はぁはぁ。
SortableCategoriesプラグインは、SortableCategories::sorterというsort_method用メソッドを提供しています。これをうまく使うことで「カテゴリツリーの管理」画面で設定した通りにカテゴリーツリーをレンダリングできます。
よく分からないなという人は、「カテゴリアーカイブ」ウィジェットを以下で置き換えれば済みます。
<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
<h3 class="widget-header">カテゴリ</h3>
<div class="widget-content">
<mt:TopLevelCategories sort_method="SortableCategories::sorter">
<mt:SubCatIsFirst>
<ul>
</mt:SubCatIsFirst>
<mt:If tag="CategoryCount">
<li><a href="<$mt:CategoryArchiveLink$>"<mt:If tag="CategoryDescription"> title="<$mt:CategoryDescription remove_html="1" encode_html="1"$>"</mt:If>><$mt:CategoryLabel$> (<$mt:CategoryCount$>)</a>
<mt:Else>
<li><$mt:CategoryLabel$>
</mt:If>
<$mt:SubCatsRecurse$>
</li>
<mt:SubCatIsLast>
</ul>
</mt:SubCatIsLast>
</mt:TopLevelCategories>
</div>
</div>
</mt:IfArchiveTypeEnabled>
mt:TopLevelCategoriesにsort_method="SortableCategories::sorter"というオプションを与えているだけです。
mt:Categoriesなどで表示されるカテゴリリストはソートされません。それは(小さい文字で長々と説明したように)必要ないからであり、仕様だからです。
まだクオリティ的にアレかもしれませんが、興味がある方は使ってみてください。