Home> Internet >  MovableType >  コード上でカテゴリー(ORフォルダ)をuser_customでのソートにするには

コード上でカテゴリー(ORフォルダ)をuser_customでのソートにするには

とある案件用に、カスタムフィールドプラグイン(あるウェブサイト上のフォルダを、管理画面の並び順(sort_by="user_custom")に選択肢として出力する)を作ってみました。

MTタグ上では、「sort_by="user_custom"」を指定(というかSubCategoriesのデフォルトになりましたね)すれば良いわけですが、プラグインコード内で、以下のように書いてもまるで並び替わる様子がありませんでした。

my @folders = MT->model( 'folder' )->load(
            {   blog_id => $blog_id,
                parent  => '0'
            },
            {   'sort' => 'user_custom',
                direction => 'ascend',
            }
        );

そういえば、この並び替えデータってどこに保存されてるんだっけと、「mt_category」や「mt_category_meta」を見てみても、特に拡張されていません。ありそうなところを一通り見ていって、やっと場所がわかりました。「mt_blog_meta」に「category_order」や「folder_order」が保存されてました。値を見るとカンマ区切りのカテゴリーIDのようです。

コレをどうするんだか解らないので、やむを得ず、「MT::Template::Tags::Category」のコードを読んでみていくと、なんかおかしな事書いてあります。

        @cats = $class->load(
            {   blog_id => $ctx->stash('blog_id'),
                parent  => '0'
            },
            {   (     ( 'user_custom' eq $sort_by )
                    ? ( sort => 'label' )
                    : ( sort => $sort_by )
                ),
                direction => $sort_order,
            }
        );

$sort_byは指定されてるsort_byなわけですが、何故かそれが「user_custom」の時に、「sort => 'label'」を設定してます。え、なんで「label」とか思ったわけですが、その後を読んでいくとやっと理由がわかりました。

    elsif ( 'user_custom' eq $sort_by ) {
        my $blog = $ctx->stash('blog');
        my $meta = $class_type . '_order';
        my $text = $blog->$meta || '';
        @$cats = MT::Category::_sort_by_id_list( $text, \@cats );
        @$cats = reverse @$cats if $sort_order eq 'descend';
    }

あぁなるほど、「sort_by="user_custom"」の場合は別に処理するわけですね。それでどうやら先ほど見つけた「category_order」を、Categoryオブジェクト(上の@cats)と一緒に、MT::Category::_sort_by_id_listに渡すことで、並べ替えが行われるみたいです。

my @folders = MT->model( 'folder' )->load(
            {   blog_id => $blog_id,
                parent  => '0'
            }
        );
my $meta = 'folder_order';
my $text = $blog->$meta || '';
@$folders = MT::Category::_sort_by_id_list( $text, \@folders );
@$folders = reverse @$folders if $sort_order eq 'descend';

こうすりゃいいってことですね。 うまくいきました。

Comment:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.zelazny.mydns.jp/cgi-bin/MT/mt-tb.cgi/2281

Home> Internet >  MovableType >  コード上でカテゴリー(ORフォルダ)をuser_customでのソートにするには

CC Licence

Creative Commons License

このブログはクリエイティブ・コモンズでライセンスされています。

Feeds

Return to page top