【最大4000ポイント進呈】MovableTypeのページ分割についてです。

的確な答えが無かったので、
再質問させていただきます。

カテゴリーページを分割しようと考えています。
条件として、
1.静的に書き出すことが出来る。
2.htmlのタイトルにページ数を表示することが出来る。
 

MTPaginateだと、PHP化で静的のHTMLになりませんが
<$MTPaginateCurrentPage>というタグを使用すれば、
タイトルにページ数を入れられる。

Paged Archives Plugin、PageButeだと静的ですが、
ページごとにタイトルを変更することが出来ない。


MTPaginate、Paged Archives Plugin、PageBute
という3種類以外にページを静的に分割できて、
なおかつタイトルにページ数を表示できるプラグインはありますでしょうか?

また、今使用させていただこうと考えているのは
PageButeですが、
ちょっとしたカスタマイズで、
ページの番号をタイトルに入れることが
出来るなどありましたら、
どうぞよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/07/31 08:40:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント4000pt

これまで MT に触ったことはなかったのですが、興味深い質問でしたのでこれを機会に使ってみました。

結果だけ見るとたったの一行なのですが、ここにたどり着くまで丸1日かかりました。


PageBute.pl の変更範囲で対応を考えたのですが、私の知識の範囲ではこの中でタイトル単体を制御すること

ができませんでした。そのため、タイトルに使用されているタグを目安にこれを置換する方法で処理をしました。

なので、今回の方法はあまり汎用性がありませんし、場合によっては使用できない可能性もあります。


前置きはこのくらいにして、実際の方法です。

PageBute.pl の _page_bute 関数部分を下記のように変更して保存後、対象の部分を再構築してみてください。

sub _page_bute {
    my ($cb, %opt) = @_;

    my $ctx = $opt{Context};
    my $pb = $ctx->stash('PageBute');
    return 1 unless($pb);

    #Get file information
    my ($filename, $file_ext);
    my $file = $opt{File};
    my $blog = $ctx->stash('blog');
    my $site_url = $blog->{column_values}->{site_url};
    $site_url = $site_url . '/' unless ($site_url =~ /\/$/);
    my $site_path = $blog->{column_values}->{site_path};
    $site_path = $site_path . "/" unless ($site_path =~ /\/$/);
    my $file_path = substr($file, length($site_path));

    if ( $file_path =~ /^[\/\\]?(.*)\.(.*?)$/ ) {
        $filename = $1;
        $file_ext = $2;
    } else {
        $filename = $file_path;
        $file_ext = '';
    }

    my $contents = $opt{Content};
    my $split_count = $pb->{count};
    my $delim = $pb->{page_delim};
    my @entries = split(/$garbage{Separator}/, $pb->{contents});
    my $page_limit = ceil( $#entries / $split_count );
    
    my $page_count = 1;
    my $output_page_contents = '';

    my $fmgr = $blog->file_mgr;

    for (my $i=0; $i < $#entries; $i++) {
        $output_page_contents .= $entries[$i];
        if( ($i + 1) % $split_count == 0 || $i == $#entries - 1) {

            $file = $page_count == 1 ? $file : "${site_path}${filename}_${page_count}.${file_ext}";
            my $output = $$contents;
#-----------------------------------------------------------------
# Page 付加処理 : "</a></h1>" を検索してその前にページ情報を追加
#-----------------------------------------------------------------
            $output =~ s/<\/a><\/h1>/ [$page_count\/$page_limit]<\/a><\/h1>/g;
#-----------------------------------------------------------------
            $output =~ s/$garbage{Contents}/$output_page_contents/g;
            my $lists = &_create_lists($page_count, $page_limit);
            my $before = $lists->{before} ? &_create_link($page_count - 1, $site_url . $filename, $file_ext, $pb->{before_delim}) : '';
            my $next = $lists->{next} ? &_create_link($page_count + 1, $site_url . $filename, $file_ext, $pb->{next_delim}) : '';
            my $page_lists = '';
            for (my $i = $lists->{min_page}; $i <= $lists->{max_page}; $i++) {
                $page_lists .= $i == $lists->{min_page} ? '' : $delim;
                $page_lists .= $i == $page_count ? $page_count : &_create_link($i, $site_url . $filename, $file_ext, $i);
            }

            #replace before link
            if ($before) {
                $output =~ s/$garbage{IfPageBefore}//g;
                $output =~ s/$garbage{BeforeLink}/$before/g;
            } else {
                $output =~ s/$garbage{IfPageBefore}.*$garbage{IfPageBefore}//g;
            }
            #replace next link
            if ($next) {
                $output =~ s/$garbage{IfPageNext}//g;
                $output =~ s/$garbage{NextLink}/$next/g;
            } else {
                $output =~ s/$garbage{IfPageNext}.*$garbage{IfPageNext}//g;
            }
            #replace page lists
            $output =~ s/$garbage{PageLists}/$page_lists/g;
            $fmgr->put_data($output,"${file}.new");
            $fmgr->rename("${file}.new",$file);

            if($page_count == 1) {
                $ctx->stash('FirstContents', $output);
                $ctx->stash('FirstFileName', $file);
            }

            $output_page_contents = '';
            $page_count++;
        }
    }
    $ctx->stash('PageBute', 0);
    1;
}

今回のケースではタイトルは

<h1><a ~>タイトル</a></h1>

となっていることを想定していますが、ここがお使いのテンプレートで異なっている場合はタイトルに使われている

タグに合わせて変更ください。


不明な点はコメントで対応しますので、コメントを有効にしてください。

http://pulltab.info/2007/12/13101208.html




変更量はたいしたことないのですが、今回は結構苦労しました。

もしお役に立ったのであれば、いるか賞を頂けると幸いです。

id:ohtsu6

mookさま

どうもありがとうございます。

出来ました。

ついでに質問させてください。

[$page_count]としましてページ番号だけを

表示するようにさせていただきました。

その際に、たとえば1ページ目の表示の場合、

[1]では無くて1ページと表示するようにしたいです。

これって簡単に出来ますでしょうか?

どうぞよろしくお願いいたします。

2008/07/29 00:33:43

その他の回答1件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント4000pt

これまで MT に触ったことはなかったのですが、興味深い質問でしたのでこれを機会に使ってみました。

結果だけ見るとたったの一行なのですが、ここにたどり着くまで丸1日かかりました。


PageBute.pl の変更範囲で対応を考えたのですが、私の知識の範囲ではこの中でタイトル単体を制御すること

ができませんでした。そのため、タイトルに使用されているタグを目安にこれを置換する方法で処理をしました。

なので、今回の方法はあまり汎用性がありませんし、場合によっては使用できない可能性もあります。


前置きはこのくらいにして、実際の方法です。

PageBute.pl の _page_bute 関数部分を下記のように変更して保存後、対象の部分を再構築してみてください。

sub _page_bute {
    my ($cb, %opt) = @_;

    my $ctx = $opt{Context};
    my $pb = $ctx->stash('PageBute');
    return 1 unless($pb);

    #Get file information
    my ($filename, $file_ext);
    my $file = $opt{File};
    my $blog = $ctx->stash('blog');
    my $site_url = $blog->{column_values}->{site_url};
    $site_url = $site_url . '/' unless ($site_url =~ /\/$/);
    my $site_path = $blog->{column_values}->{site_path};
    $site_path = $site_path . "/" unless ($site_path =~ /\/$/);
    my $file_path = substr($file, length($site_path));

    if ( $file_path =~ /^[\/\\]?(.*)\.(.*?)$/ ) {
        $filename = $1;
        $file_ext = $2;
    } else {
        $filename = $file_path;
        $file_ext = '';
    }

    my $contents = $opt{Content};
    my $split_count = $pb->{count};
    my $delim = $pb->{page_delim};
    my @entries = split(/$garbage{Separator}/, $pb->{contents});
    my $page_limit = ceil( $#entries / $split_count );
    
    my $page_count = 1;
    my $output_page_contents = '';

    my $fmgr = $blog->file_mgr;

    for (my $i=0; $i < $#entries; $i++) {
        $output_page_contents .= $entries[$i];
        if( ($i + 1) % $split_count == 0 || $i == $#entries - 1) {

            $file = $page_count == 1 ? $file : "${site_path}${filename}_${page_count}.${file_ext}";
            my $output = $$contents;
#-----------------------------------------------------------------
# Page 付加処理 : "</a></h1>" を検索してその前にページ情報を追加
#-----------------------------------------------------------------
            $output =~ s/<\/a><\/h1>/ [$page_count\/$page_limit]<\/a><\/h1>/g;
#-----------------------------------------------------------------
            $output =~ s/$garbage{Contents}/$output_page_contents/g;
            my $lists = &_create_lists($page_count, $page_limit);
            my $before = $lists->{before} ? &_create_link($page_count - 1, $site_url . $filename, $file_ext, $pb->{before_delim}) : '';
            my $next = $lists->{next} ? &_create_link($page_count + 1, $site_url . $filename, $file_ext, $pb->{next_delim}) : '';
            my $page_lists = '';
            for (my $i = $lists->{min_page}; $i <= $lists->{max_page}; $i++) {
                $page_lists .= $i == $lists->{min_page} ? '' : $delim;
                $page_lists .= $i == $page_count ? $page_count : &_create_link($i, $site_url . $filename, $file_ext, $i);
            }

            #replace before link
            if ($before) {
                $output =~ s/$garbage{IfPageBefore}//g;
                $output =~ s/$garbage{BeforeLink}/$before/g;
            } else {
                $output =~ s/$garbage{IfPageBefore}.*$garbage{IfPageBefore}//g;
            }
            #replace next link
            if ($next) {
                $output =~ s/$garbage{IfPageNext}//g;
                $output =~ s/$garbage{NextLink}/$next/g;
            } else {
                $output =~ s/$garbage{IfPageNext}.*$garbage{IfPageNext}//g;
            }
            #replace page lists
            $output =~ s/$garbage{PageLists}/$page_lists/g;
            $fmgr->put_data($output,"${file}.new");
            $fmgr->rename("${file}.new",$file);

            if($page_count == 1) {
                $ctx->stash('FirstContents', $output);
                $ctx->stash('FirstFileName', $file);
            }

            $output_page_contents = '';
            $page_count++;
        }
    }
    $ctx->stash('PageBute', 0);
    1;
}

今回のケースではタイトルは

<h1><a ~>タイトル</a></h1>

となっていることを想定していますが、ここがお使いのテンプレートで異なっている場合はタイトルに使われている

タグに合わせて変更ください。


不明な点はコメントで対応しますので、コメントを有効にしてください。

http://pulltab.info/2007/12/13101208.html




変更量はたいしたことないのですが、今回は結構苦労しました。

もしお役に立ったのであれば、いるか賞を頂けると幸いです。

id:ohtsu6

mookさま

どうもありがとうございます。

出来ました。

ついでに質問させてください。

[$page_count]としましてページ番号だけを

表示するようにさせていただきました。

その際に、たとえば1ページ目の表示の場合、

[1]では無くて1ページと表示するようにしたいです。

これって簡単に出来ますでしょうか?

どうぞよろしくお願いいたします。

2008/07/29 00:33:43
id:falcon2 No.2

回答回数331ベストアンサー獲得回数2

ポイント35pt

カテゴリーのプラグインについては過去質にあり

  • id:Mook
    動作確認はしていませんが、
    $output =~ s/<¥/a><¥/h1>/ $page_countページ<¥/a><¥/h1>/g;
    ではダメでしょうか。
    (¥は全角で書いているので、実際は半角で記入ください。)

    文字化けするようなら、対策を検討してみます。
  • id:Mook
    可能性のお話ですが、MT 自体はページを UTF-8で出力しているようなので、
    PageBute.pl を UTF-8にしてから、上記の変更をしてみると文字化けなく
    できるかもしれません。
    それがだめなら、Jcode.pl 等を利用するかでしょうか。

    文字コードの指定できるエディタをお持ちでしたら、上記を試してみてください。
  • id:ohtsu6
    PageBute.pl を UTF-8に変更したら
    文字化けが無く出来ました。

    どうもありがとうございました。
  • id:Mook
    文字化けではまると大変かなぁ、と思っていたのですが、
    解決したようでなによりでした。
  • id:Mook
    過分なポイントと、いるか賞ありがとうございました。

    昔の質問を見返してみたら、以前にも ohtsu6 さんにはたくさんのポイントを頂いていたんですね。
    最近興味のあるのが Ruby と、今回の件で MT にも興味がわいたのでいただいたポイントは技術書の
    購入の一部にさせていただきたいと思ってます。

    多少の問題点は対応しますので、なにかありましたらコメントください。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません