MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)
MT4.1:カテゴリの並べ替え(カスタムフィールド+ハッシュ変数) にあるような、カテゴリの並べ替えを行ってみた。
ただし今回はMTタグのみ・カスタムフィールドなどではなくオリジナルのプラグインを併用する。このオリジナルのプラグインは、カテゴリへソート用のインデックスを付与するもので、カテゴリ管理画面からソートインデックスを与えることができ、MTタグでそれを使用できるというもの。
私が「なんでこの機能標準じゃないのさ?」とぼやいていた機能である。ちなみにプラグイン開発の練習用であるので、それほど熱心に作りこんでは居ない。手抜き。
どういう機能を付加したか
管理画面へ、図示したようなカテゴリ並べ替え用のインデックスを付与するフィールドを追加する。ここに登録した値はシステムによってMTのデータベースへ格納される。
日本語化?面倒なんでしない。
phpMyAdminで拡張されたDBフィールドを確認している図。
大まかな仕様とポイント
今のところ、最小限な仕様である。
- 入力したデータはDBへ保存。
- init_registryのobject_types以下にフィールド名とデータ長を書いている。
- カテゴリ画面にソート用のインデックスフィールドを表示すること。
- alt-tmplフォルダへ専用の画面テンプレート(ファイル名:edit_category.tmpl)を置いた。ここのファイルのほうが標準テンプレートより優先されて読み込まれる。なお標準のファイルはtmpl\cmsフォルダにあるんで、今回はこれをコピペして編集した。
- MTタグでデータを取り出せること。
- MTCategorySortIndexというテンプレートタグが拡張追加され、このタグで、追加したソート用インデックスを取り出せる。
categoryindexadd.pl プラグインファイル ソース
package MT::Plugin::CategoryIndexAdd;
use strict;
use base qw(MT::Plugin);
require MT::Category;
our $VERSION = '0.1';
my $plugin = MT::Plugin::CategoryIndexAdd->new({
id => 'CategoryIndexAdd',
key => 'category_index_add',
name => 'CategoryIndexAdd',
version => $VERSION,
description => '<MT_TRANS phrase=\'This Is CategoryIndexAdd Sample\'>',
schema_version => 0.01,
});
MT->add_plugin($plugin);
sub init_registry
{
my $plugin = shift;
$plugin->registry({
object_types => {
'category' => {
'sort_index_custom' => 'string(255)',
},
},
tags => {
function => {
'CategorySortIndex' => sub{&_hdlr_sort_index_custom;},
},
},
});
}
sub _hdlr_sort_index_custom {
my ($ctx, $args) = @_;
my $tag = 'CategoryIndexAdd';
(my $category = $ctx->stash('category')) || return $ctx->_no_category_error('MT' . $tag);
return $category->sort_index_custom || '';
}
1;
edit_category.tmpl 代替テンプレート ソース
edit_category.tmpl 代替テンプレート。alt-tmplフォルダへ置く。標準のedit_category.tmplをベースに、<!-- Category Sort Add -->で挟まれた部分を追記したのみである。
<mt:setvar name="page_title" value="<__trans phrase="Edit Category">">
<$mt:setvar name="position_actions_bottom" value="1"$>
<MTSetVarBlock name="system_msg">
<mt:if name="error">
<mtapp:statusmsg
id="generic-error"
class="error">
<mt:var name="error">
</mtapp:statusmsg>
</mt:if>
<mt:if name="saved">
<mtapp:statusmsg
id="saved"
class="success"
rebuild="all">
<__trans phrase="Your category changes have been made.">
</mtapp:statusmsg>
</mt:if>
</MTSetVarBlock>
<mt:include name="include/header.tmpl">
<script type="text/javascript">
<!--
function validate(form) {
if (form.label.value.match(/\S/,''))
return true;
alert('<__trans phrase="You must specify a label for the category." escape="singlequotes">');
form.label.focus();
return false;
}
function toggleFile() {
var fld = getByID("basename");
if (fld) {
fld.disabled = false;
fld.focus();
var baseman = getByID("basename_manual");
if (baseman) baseman.value = "1";
var basewarn = getByID("basename-warning");
if (basewarn) basewarn.style.display = "block";
}
var img = getByID("basename-lock");
if (img)
img.style.display = 'none';
return false;
}
var tableSelect;
function init()
{
// setup
tableSelect = new TC.TableSelect( "<$mt:var name="asset_type"$>-listing-table" );
tableSelect.rowSelect = true;
}
TC.attachLoadEvent( init );
//-->
</script>
<div id="category-details-content">
<form method="post" action="<mt:var name="script_url">" onsubmit="return validate(this)">
<input type="hidden" name="blog_id" value="<mt:var name="blog_id">" />
<input type="hidden" name="__mode" value="save" />
<input type="hidden" name="_type" value="<mt:var name="object_type">" />
<input type="hidden" name="id" value="<mt:var name="id">" />
<input type="hidden" name="return_args" value="<mt:var name="return_args" escape="html">" />
<input type="hidden" name="magic_token" value="<mt:var name="magic_token">" />
<input type="hidden" name="category_parent" value="<mt:var name="parent">" />
<fieldset>
<mtapp:setting
id="label"
label="<__trans phrase="Label">">
<div class="textarea-wrapper">
<input name="label" id="label" class="full-width" maxlength="100" value="<mt:var name="label" escape="html">" class="wide" />
</div>
</mtapp:setting>
<input type="hidden" name="basename_manual" id="basename_manual" value="0" />
<input type="hidden" name="basename_old" id="basename_old" value="<mt:var name="basename_old" escape="html">" />
<mtapp:setting
id="basename"
label="<__trans phrase="_CATEGORY_BASENAME">"
hint="<__trans phrase="This is the basename assigned to your category.">"
help_page="categories"
help_section="category_basename">
<input name="basename" id="basename" class="width90" maxlength="250" value="<mt:var name="basename" escape="html">" disabled="disabled" onchange="setElementValue('basename', dirify(this.value))" />
<a href="javascript:void(0);"id="basename-lock" title="<__trans phrase="Unlock this category’s output filename for editing">" onclick="return toggleFile()"><span>Unlock</span></a>
<p class="alert-warning-inline" id="basename-warning" style="display: none;">
<img src="<mt:var name="static_uri">images/status_icons/warning.gif" alt="<__trans phrase="Warning">" width="9" height="9" />
<__trans phrase="Warning: Changing this category's basename may break inbound links.">
</p>
</mtapp:setting>
<mtapp:setting
id="description"
label="<__trans phrase="Description">">
<textarea name="description" id="description" rows="" cols="" class="full-width short"><mt:var name="description" escape="html"></textarea>
</mtapp:setting>
</fieldset>
<fieldset>
<h3><__trans phrase="Inbound TrackBacks"></h3>
<mtapp:setting
id="allow_pings"
label="<__trans phrase="Accept Trackbacks">"
hint="<__trans phrase="If enabled, TrackBacks will be accepted for this category from any source.">"
help_page="categories"
help_section="accept_category_pings">
<input type="checkbox" name="allow_pings" id="allow_pings" value="1" onclick="toggleSubPrefs(this); return true"<mt:if name="allow_pings"> checked="checked"</mt:if> class="cb" />
</mtapp:setting>
<mt:if name="tb">
<mtapp:setting
id="view_trackbacks"
label="<__trans phrase="TrackBacks">">
<div id="view_trackbacks"><strong><a href="<$mt:var name="script_url">?__mode=list_pings&filter=category_id&filter_val=<$mt:var name="id"$>&blog_id=<$mt:var name="blog_id"$>"><__trans phrase="View TrackBacks"></a></strong></div>
</mtapp:setting>
</mt:if>
<div id="allow_pings_prefs" style="display:<mt:if name="allow_pings">block<mt:else>none</mt:if>">
<mt:if name="tb_url">
<mtapp:setting
id="trackback_url"
label="<__trans phrase="TrackBack URL for this category">"
hint="<__trans phrase="_USAGE_CATEGORY_PING_URL">">
<div class="textarea-wrapper">
<input type="text" name="trackback_url" id="trackback_url" readonly="readonly" value="<mt:var name="tb_url" escape="html">" class="full-width" />
</div>
</mtapp:setting>
<mtapp:setting
id="tb_passphrase"
label="<__trans phrase="Passphrase Protection">"
hint="<__trans phrase="Optional">"
help_page="categories"
help_section="trackback_passphrase_protection">
<div class="textarea-wrapper">
<input name="tb_passphrase" id="tb_passphrase" class="full-width" value="<mt:var name="tb_passphrase" escape="html">" size="30" />
</div>
</mtapp:setting>
</mt:if>
</div>
</fieldset>
<fieldset>
<h3><__trans phrase="Outbound TrackBacks"></h3>
<mtapp:setting
id="ping_urls"
label="<__trans phrase="Trackback URLs">"
hint="<__trans phrase="Enter the URL(s) of the websites that you would like to send a TrackBack to each time you create an entry in this category. (Separate URLs with a carriage return.)">"
help_page="categories"
help_section="categories_urls_to_ping">
<textarea name="ping_urls" id="ping_urls" cols="" rows="" class="full-width short"><mt:var name="ping_urls" escape="html"></textarea>
</mtapp:setting>
</fieldset>
<!-- Category Sort Add -->
<fieldset>
<h3>Input Category Sort Index</h3>
<mtapp:setting
id="sort_index_custom"
label="Category Sort Index Input">
<div class="textarea-wrapper">
<input name="sort_index_custom" id="sort_index_custom" class="full-width" maxlength="100" value="<mt:var name="sort_index_custom" escape="html">" class="wide" />
</div>
</mtapp:setting>
</fieldset>
<!-- Category Sort Add -->
<mt:setvarblock name="action_buttons">
<button
type="submit"
accesskey="s"
title="<__trans phrase="Save changes to this category (s)">"
class="primary-button"
><__trans phrase="Save Changes"></button>
</mt:setvarblock>
<mt:include name="include/actions_bar.tmpl" bar_position="bottom" hide_pager="1" settings_bar="1">
</form>
</div>
<mt:include name="include/footer.tmpl">
このプラグインを利用したMTタグの組み方
追加したソート用インデックスを用いてカテゴリリストの並べ替えを行う場合は、こんな感じでOK。インデックスが同じであるとデータを上書きするので注意。
<p>LoopのKeyで並べ替え</p>
<MTCategories>
<MTSetvarBlock name="catid"><MTCategorySortIndex></MTSetvarBlock>
<MTSetvarBlock name="catlinkset"><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><$MTCategoryLabel$> (<$MTCategoryCount$>)</a></MTSetvarBlock>
<MTSethashVar name="catlist">
<MTSetVar name="$catid" value="$catlinkset">
</MTSethashVar>
</MTCategories>
<ul>
<mt:loop name="catlist" sort_by="key">
<li><$mt:getvar name="__value__"$></li>
</mt:loop>
</ul>
- カテゴリ:215プラグイン関係
トラックバック(0)
このブログ記事を参照しているブログ一覧: MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)
このブログ記事に対するトラックバックURL:
- Categories
- Entries
-
- 管理画面を拡張する(メニューとメソッド追加)
- MT4.1:追加したファンクションタグのみへモデファイア追加
- MT4.1:エントリの既存DBへアクセスしてデータ取得
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)開発の話
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)配布
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(プラグイン設定編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(ブログ毎編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(カテゴリ編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(エントリ編)
- MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)
- サンプルプラグインを手入力した(AddField)
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン
- サンプルプラグインを手入力した(RandomEntry)
- 最小単位のプラグインを生成するサンプル(ファンクション、ブロック、モデファイア、コールバック)

コメントする