Movable Typeのブログ選択メニューをカスタマイズする
「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
変更内容に一部誤りがありましたので修正しました。
- Movable TypeにGoogle Analyticsの情報を設定する方法
- Movable Type 5.1のリスティングフレームワークで独自管理画面を作る(その1)
- Movable Typeのインポート・エクスポートでカスタムフィールドを扱う
- ブログ記事の本文編集エリアを拡張する
- テンプレート一覧のアクションに「テンプレートの再構築」を追加する
- Movable Type の管理画面用テンプレートファイル名を管理画面に表示する
- Movable Type で簡単に valid な XHTML 文書を作る
- アップロードしたファイルをブログ記事に挿入する
- カスタムフィールドのラジオボタンを横並びにする
- Movable Type でメールマガジンを作る(メールアドレスの解除)
- Movable Type 4 のブログ記事投稿画面のカテゴリー選択エリアを拡張する
- カスタムフィールドによるアップロード画像をサムネイルで表示するプラグイン 0.02
- CORESERVER / XREA にcron ジョブ(Movable Type 4 の run-periodic-tasks)を設定する
- Movable Type のスケジュール・タスク実行(Windows 編)
- インデックステンプレートにパスを設定する
いつもとてもお世話になっています。
こちらをプラグイン化することは出来ないでしょうか?
理由は、サーバやMTの管理などは自身で行えない場合等に、
アップデートして、戻ってしまうなどを防げないかなーと思ったためです。
もし宜しければお願いします。
>hiraさん
こんばんは。
ご質問の件ですが、プラグインで実現可能か動作確認してみます。
それではよろしくお願い致します。