Under the Bridge

a Picture of the Late Him

MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)

2008年5月 4日 15:25 | Writer: yoshi | 記事本文 | コメント(0) | トラックバック(0)

MT4.1:カテゴリの並べ替え(カスタムフィールド+ハッシュ変数) にあるような、カテゴリの並べ替えを行ってみた。

ただし今回はMTタグのみ・カスタムフィールドなどではなくオリジナルのプラグインを併用する。このオリジナルのプラグインは、カテゴリへソート用のインデックスを付与するもので、カテゴリ管理画面からソートインデックスを与えることができ、MTタグでそれを使用できるというもの。

私が「なんでこの機能標準じゃないのさ?」とぼやいていた機能である。ちなみにプラグイン開発の練習用であるので、それほど熱心に作りこんでは居ない。手抜き。

どういう機能を付加したか

20080504_01.png

管理画面へ、図示したようなカテゴリ並べ替え用のインデックスを付与するフィールドを追加する。ここに登録した値はシステムによってMTのデータベースへ格納される。

日本語化?面倒なんでしない。

20080504_02.png

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&rsquo;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&amp;filter=category_id&amp;filter_val=<$mt:var name="id"$>&amp;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>

トラックバック(0)

このブログ記事を参照しているブログ一覧: MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)

このブログ記事に対するトラックバックURL:

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)