Movable Typeのブログ選択メニューをカスタマイズする

Movable Typeのブログ選択メニューをカスタマイズする

Posted at August 6,2011 1:11 AM
Tag:[Menu, MovableType]

「Movable Type 5.1のブログ選択メニューについて」でブログ選択メニューの基本動作について紹介しましたが、本エントリーではブログ選択メニューに表示するウェブサイトやブログの数をカスタマイズする方法を紹介します。

このカスタマイズを行うことでブログ選択メニューに表示するウェブサイト・ブログ数を増やすことができます。

変更前
ブログ選択メニュー(変更前)

変更後
ブログ選択メニュー(変更後)

1.ブログ数表示のカスタマイズ

任意のエディタでlib/MT/App/CMS.pmを開き、以下の赤色部分を青色の内容に変更します。MT5.12であれば3100行目辺りにあります。

変更前

sub build_blog_selector {
    my $app = shift;
    my ($param) = @_;
    …中略…
 
    # Load favorites blogs
    my @fav_blogs = @{ $auth->favorite_blogs || [] };
    if ( scalar @fav_blogs > 5 ) {
        @fav_blogs = @fav_blogs[ 0 .. 4 ];
    }
 
    # How many blogs that the user can access?
    my %args;
    my %terms;
    $args{join}
        = MT::Permission->join_on( 'blog_id',
        { author_id => $auth->id, permissions => { not => "'comment'" } } )
        if !$auth->is_superuser
            && !$auth->permissions(0)->can_do('edit_templates');
    $terms{class}     = 'blog';
    $terms{parent_id} = \">0"; # baka editors ";
    $args{limit}      = 6;        # Don't load over 6 blogs
    my @blogs = $blog_class->load( \%terms, \%args );
 
# Special case. If this user can access 5 blogs or smaller then load those blogs.
    $param->{selector_hide_blog_chooser} = 1;
    if ( @blogs && scalar @blogs == 6 ) {
 
        # This user can access over 6 blogs.
        if (@fav_blogs) {
            @blogs = $blog_class->load( { id => \@fav_blogs } );
        }
        else {
            @blogs = ();
        }
        $param->{selector_hide_blog_chooser} = 0;
    }
    …後略…

変更後

sub build_blog_selector {
    my $app = shift;
    my ($param) = @_;
    …中略…
 
    # Load favorites blogs
    my @fav_blogs = @{ $auth->favorite_blogs || [] };
    if ( scalar @fav_blogs > 10 ) {
        @fav_blogs = @fav_blogs[ 0 .. 9 ];
    }
 
    # How many blogs that the user can access?
    my %args;
    my %terms;
    $args{join}
        = MT::Permission->join_on( 'blog_id',
        { author_id => $auth->id, permissions => { not => "'comment'" } } )
        if !$auth->is_superuser
            && !$auth->permissions(0)->can_do('edit_templates');
    $terms{class}     = 'blog';
    $terms{parent_id} = \">0"; # baka editors ";
    $args{limit}      = 11;        # Don't load over 6 blogs
    my @blogs = $blog_class->load( \%terms, \%args );
 
# Special case. If this user can access 5 blogs or smaller then load those blogs.
    $param->{selector_hide_blog_chooser} = 1;
    if ( @blogs && scalar @blogs == 11 ) {
 
        # This user can access over 6 blogs.
        if (@fav_blogs) {
            @blogs = $blog_class->load( { id => \@fav_blogs } );
        }
        else {
            @blogs = ();
        }
        $param->{selector_hide_blog_chooser} = 0;
    }
    …後略…

この変更ではウェブサイト管理画面・システム管理画面・ユーザーダッシュボードで最大10ブログ、ブログ管理画面で最大9ブログを表示するようにしています。

また、「ブログを選択」のテキストリンクをクリックしたときに適切な表示にするために、lib/MT/App/CMS/Blog.pmを開き、以下の赤色部分を青色の内容に変更します。MT5.12であれば3100行目辺りにあります。

2015.5.13追記
Movable Type6.1以降の場合、lib/MT/App/CMS/Blog.pmの修正は不要です(仕様変更のため)。

変更前

sub dialog_select_weblog {
    my $app = shift;
 
    my $favorites = $app->param('select_favorites');
    my %favorite;
    my $confirm_js;
    my $terms = {};
    my $args  = {};
    my $auth  = $app->user or return;
 
    if ($favorites) {
        my @favs = @{ $auth->favorite_blogs || [] };
        if (@favs) {
            @favs = @favs[ 0 .. 4 ] if scalar @favs > 5;
            $terms->{id} = { not => \@favs };
        }
        $confirm_js = 'saveFavorite';
    }
    …後略…

変更後

sub dialog_select_weblog {
    my $app = shift;
 
    my $favorites = $app->param('select_favorites');
    my %favorite;
    my $confirm_js;
    my $terms = {};
    my $args  = {};
    my $auth  = $app->user or return;
 
    if ($favorites) {
        my @favs = @{ $auth->favorite_blogs || [] };
        if (@favs) {
            @favs = @favs[ 0 .. 9 ] if scalar @favs > 10;
            $terms->{id} = { not => \@favs };
        }
        $confirm_js = 'saveFavorite';
    }
    …後略…

2.ウェブサイト表示数のカスタマイズ

ウェブサイト表示数は、1項で変更した箇所の少し下にあります。赤色部分を青色の内容に変更します。

MT5までとMT6以降で若干修正内容が異なりますので両方掲載しておきます。

変更前(MT5まで)

    …前略…
    # Load favorites or all websites
    my @fav_websites = @{ $auth->favorite_websites || [] };
    my @websites;
    @websites = $website_class->load( { id => \@fav_websites } )
        if scalar @fav_websites;
 
    my $max_load = $blog && $blog->is_blog ? 3 : 4;
    if ( scalar @fav_websites < $max_load ) {
 
        # Load more accessible websites
        %args  = ();
        %terms = ();
 
        $args{join} = MT::Permission->join_on( 'blog_id',
            { author_id => $auth->id, permissions => { not => "'comment'" } }
            )
            if !$auth->is_superuser
                && !$auth->permissions(0)->can_do('edit_templates');
        $terms{class} = 'website';
        my $not_ids;
        push @$not_ids, @fav_websites;
        push @$not_ids, $blog->website->id if $blog && $blog->is_blog;
        $terms{id} = { not => $not_ids } if scalar @$not_ids;
        $args{limit} = $max_load
            - ( scalar @fav_websites );    # Don't load over 3 ~ 4 websites.
        my @sites = $website_class->load( \%terms, \%args );
        push @websites, @sites;
    }
 
    if ( @fav_websites ) {
        my $i;
        my %sorted = map{ $_ => $i++ } @fav_websites;
        foreach ( @websites ) {
            $sorted{$_->id} = scalar @websites if !exists $sorted{$_->id};
        }
        @websites = sort { ( $sorted{$a->id} || 0 ) <=> ( $sorted{$b->id} || 0 ) } @websites;
    }
    unshift @websites, $blog->website if $blog && $blog->is_blog;
 
# Special case. If this user can access 3 websites or smaller then load those websites.
    $param->{selector_hide_website_chooser} = 1;
    if ( @websites && scalar @websites == 4 ) {
        pop @websites;
        $param->{selector_hide_website_chooser} = 0;
    }
    …後略…

変更後(MT5まで)

    …前略…
    # Load favorites or all websites
    my @fav_websites = @{ $auth->favorite_websites || [] };
    my @websites;
    @websites = $website_class->load( { id => \@fav_websites } )
        if scalar @fav_websites;
 
    my $max_load = $blog && $blog->is_blog ? 9 : 10;
    if ( scalar @fav_websites < $max_load ) {
 
        # Load more accessible websites
        %args  = ();
        %terms = ();
 
        $args{join} = MT::Permission->join_on( 'blog_id',
            { author_id => $auth->id, permissions => { not => "'comment'" } }
            )
            if !$auth->is_superuser
                && !$auth->permissions(0)->can_do('edit_templates');
        $terms{class} = 'website';
        my $not_ids;
        push @$not_ids, @fav_websites;
        push @$not_ids, $blog->website->id if $blog && $blog->is_blog;
        $terms{id} = { not => $not_ids } if scalar @$not_ids;
        $args{limit} = $max_load
            - ( scalar @fav_websites );    # Don't load over 3 ~ 4 websites.
        my @sites = $website_class->load( \%terms, \%args );
        push @websites, @sites;
    }
 
    if ( @fav_websites ) {
        my $i;
        my %sorted = map{ $_ => $i++ } @fav_websites;
        foreach ( @websites ) {
            $sorted{$_->id} = scalar @websites if !exists $sorted{$_->id};
        }
        @websites = sort { ( $sorted{$a->id} || 0 ) <=> ( $sorted{$b->id} || 0 ) } @websites;
    }
    unshift @websites, $blog->website if $blog && $blog->is_blog;
 
# Special case. If this user can access 3 websites or smaller then load those websites.
    $param->{selector_hide_website_chooser} = 1;
    if ( @websites && scalar @websites == 9 ) {
        pop @websites;
        $param->{selector_hide_website_chooser} = 0;
    }
    …後略…

この変更ではシステム管理画面・ユーザーダッシュボードで最大5ウェブサイト、ウェブサイト管理画面で最大4ウェブサイトを表示するようにしています。

変更前(MT6以降)

    # Load favorites or all websites
    my @fav_websites = @{ $auth->favorite_websites || [] };
    if ( scalar @fav_websites > 5 ) {
        @fav_websites = @fav_websites[ 0 .. 4 ];
    }
    my @websites;
    @websites = $website_class->load( { id => \@fav_websites } )
        if scalar @fav_websites;
 
    my $max_load = 6;
    if ( scalar @fav_websites < $max_load ) {
    …中略…
    }
 
    if (@fav_websites) {
        my $i;
        my %sorted = map { $_ => $i++ } @fav_websites;
        foreach (@websites) {
            $sorted{ $_->id } = scalar @websites if !exists $sorted{ $_->id };
        }
        @websites
            = sort { ( $sorted{ $a->id } || 0 ) <=> ( $sorted{ $b->id } || 0 ) }
            @websites;
    }
 
# Special case. If this user can access 3 websites or smaller then load those websites.
    $param->{selector_hide_website_chooser} = 1;
    if ( @websites && scalar @websites == 6 ) {
        pop @websites;
        $param->{selector_hide_website_chooser} = 0;
    }

変更後(MT6以降)

    # Load favorites or all websites
    my @fav_websites = @{ $auth->favorite_websites || [] };
    if ( scalar @fav_websites > 5 ) {
        @fav_websites = @fav_websites[ 0 .. 4 ];
    }
    my @websites;
    @websites = $website_class->load( { id => \@fav_websites } )
        if scalar @fav_websites;
 
    my $max_load = 11;
    if ( scalar @fav_websites < $max_load ) {
    …中略…
    }
 
    if (@fav_websites) {
        my $i;
        my %sorted = map { $_ => $i++ } @fav_websites;
        foreach (@websites) {
            $sorted{ $_->id } = scalar @websites if !exists $sorted{ $_->id };
        }
        @websites
            = sort { ( $sorted{ $a->id } || 0 ) <=> ( $sorted{ $b->id } || 0 ) }
            @websites;
    }
 
# Special case. If this user can access 3 websites or smaller then load those websites.
    $param->{selector_hide_website_chooser} = 1;
    if ( @websites && scalar @websites == 11 ) {
        pop @websites;
        $param->{selector_hide_website_chooser} = 0;
    }

この変更ではシステム管理画面・ユーザーダッシュボードで最大10ウェブサイト、ウェブサイト管理画面で最大9ウェブサイトを表示するようにしています。

2015.5.13
変更内容に一部誤りがありましたので修正しました。

関連記事
トラックバックURL


コメント

いつもとてもお世話になっています。

こちらをプラグイン化することは出来ないでしょうか?

理由は、サーバやMTの管理などは自身で行えない場合等に、
アップデートして、戻ってしまうなどを防げないかなーと思ったためです。

もし宜しければお願いします。

[1] Posted by hira logo : October 29, 2011 6:20 PM

>hiraさん
こんばんは。
ご質問の件ですが、プラグインで実現可能か動作確認してみます。
それではよろしくお願い致します。

[2] Posted by yujiro logo : October 30, 2011 11:36 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)