ページ分割の Ajax 化
Movable Type で MTPaginate を利用したページ分割の Ajax 化です。
このカスタマイズは1年以上前に作ったもので、実装がいまひとつなため公開していなかったのですが、「こういうやり方もあります」という、案レベルの位置づけで公開します。
サンプルを用意しましたのでお試しください(ファイルサイズが小さいため効果が分かりにくいです)。
仕組みは、ページナビゲーションのリンクをクリックした時、リンク先のページを Ajax 経由で呼び出し、取得したファイルから必要な部分だけを切り出して、ページに表示させるというものです。
以下、カスタマイズ方法です。
ページ分割用プラグインは MTPaginate バージョン 1.28 を利用しています。プラグインは「MT Extensions: MTPaginate」よりダウンロードし、Movable Type に予めインストールし、ページ分割の設定まで行っておいてください。ページ分割の方法については「ページ分割」のカテゴリーを参照願います。
本エントリーのカスタマイズはトップページまたはエントリー・アーカイブ以外のアーカイブページでのみ有効です。またブログの文字コードが UTF-8 のみ適用可能です。
1.prototype.js のダウンロード・アップロード
上記のサイトにある Download the latest version のリンクをクリックし、アーカイブをダウンロードします。アーカイブを解凍して、dist フォルダの中にある prototype.js を使用します(他は使いません)。
prototype.js は index.php と同じディレクトリにアップロードしてください。
2.paginate.js のダウンロード・アップロード
下記の paginate.js をダウンロードし、index.php と同じディレクトリにアップロードしてください。
3.プラグインファイル修正
MTPaginate/lib/MTPaginate.pm
を任意のエディタで開き、下記の赤色部分を青色の内容に書き換えます。
sub PaginateNavigator {
:
(中略)
:
} else {
my $target = $args->{target} || "";
if($pg->{mode} eq 'cgi') {
$target = " target=\"$target\"" if $target;
if ($format_all && $place_all ne 'after') {
my $title = "";
$title = sprintf(" title=\"$format_all_title\"", $num_pages) if $format_all_title;
if($pg->{current_page} eq 'all') {
$res .= "$all_current$separator";
} else {
$res .= "<a href=\"" . $pg->{paginate_self} . "=all$anchor\"$title$target>$all</a>$separator";
$res .= "<a href=\"\#\" onclick=\"changePage('" . $pg->{paginate_self} . "=all$anchor')\"$title$target>$all</a>$separator";
}
}
$start = ($list_pages eq 'after') ? $pg->{current_page}+1 : 1;
$end = ($list_pages eq 'before') ? $pg->{current_page}-1 : $num_pages;
$format_title = " title=\"$format_title\"" if $format_title;
for(my $i = $start; $i <= $end; $i++) {
$res .= $separator if($i > $start);
if($i eq $pg->{current_page}) {
$res .= sprintf("$format_current", $i);
} else {
$res .= "<a href=\"" . $pg->{paginate_self} . "=$i$anchor\"$target" . sprintf($format_title, $i) . sprintf(">$format", $i) . '</a>';
$res .= "<a href=\"\#\" onclick=\"changePage('" . $pg->{paginate_self} . "=$i$anchor')\"$target" . sprintf($format_title, $i) . sprintf(">$format", $i) . '</a>';
}
}
if ($format_all && $place_all eq 'after') {
my $title = "";
$title = sprintf(" title=\"$format_all_title\"", $num_pages) if $format_all_title;
if($pg->{current_page} eq 'all') {
$res .="$all_current$separator";
} else {
$res .= "<a href=\"" . $pg->{paginate_self} . "=all$anchor\"$title$target>$all</a>$separator";
$res .= "<a href=\"\#\" onclick=\"changePage('" . $pg->{paginate_self} . "=all$anchor')\"$title$target>$all</a>$separator";
}
}
} else {
$target = " target=\\\"$target\\\"" if $target;
$res = "<?php\n";
if ($format_all && $place_all ne 'after') {
my $title = "";
$title = sprintf(" title=\\\"$format_all_title\\\"", $num_pages) if $format_all_title;
$res .=<<PHP
if(\$paginate_current_page == 'all') {
echo '$all_current$separator';
} else {
echo "<a href=\\\"\$paginate_self=all$anchor\\\"$title$target>$all</a>$separator";
echo "<a href=\\\"\#\\\" onclick=\\\"changePage('\$paginate_self=all$anchor')\\\"$title$target>$all</a>$separator";
}
PHP
}
$format_title = " . sprintf(' title=\"$format_title\"', \$i)" if $format_title;
$res .=<<PHP;
for(\$i = $start; \$i <= $end; \$i++) {
if(\$i > $start)
echo '$separator';
if(\$i == \$paginate_current_page) {
echo sprintf("$format_current", \$i);
} else {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
echo "<a href=\\\"\#\\\" onclick=\\\"changePage('\$paginate_self=\$i$anchor')\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
}
PHP
if ($format_all && $place_all eq 'after') {
my $title = "";
$title = sprintf(" title=\\\"$format_all_title\\\"", $num_pages) if $format_all_title;
$res .=<<PHP
if(\$paginate_current_page == 'all') {
echo '$separator$all_current';
} else {
echo "$separator<a href=\\\"\$paginate_self=all$anchor\\\"$title$target>$all</a>";
echo "$separator<a href=\\\"\#\\\" onclick=\\\"changePage('\$paginate_self=all$anchor')\\\"$title$target>$all</a>";
}
PHP
}
$res .=<<PHP;
?>
PHP
}
}
return $res;
}
修正後、保存して元のディレクトリにアップロードしてください。
4.テンプレートに script 要素追加
ページ分割を行いたいテンプレートに、下記の script 要素を追加します。
<script type="text/javascript" src="<$MTBlogURL$>prototype.js"></script>
<script type="text/javascript" src="<$MTBlogURL$>paginate.js"></script>
5.Ajax 対象部分にHTMLコメント追加
Ajax 化を行ないたい部分に、下の HTML コメント(青色)を追加します。ここでは当サイトの配布テンプレートを使用しているので、中央カラム全体を括っている div 要素(id 属性 content)のすぐ内側に設定します。
:
<div id="content">
<!-- AjaxStart -->
:
(中略)
:
<!-- AjaxEnd -->
</div>
:
2007.12.06
最後のリストより、<!-- /content -->
を削除(MT4でコメントタグを削除したため)
- Movable Type 7のコンテンツデータ(コンテンツタイプアーカイブ)をページ分割する方法
- Movable Typeでブログ記事やウェブページをページ分割する方法
- Movable Typeの「最近のブログ記事」をページ分割する
- PageButeプラグインでページ分割がないときにナビゲーションや(X)HTMLマークアップを表示しない方法
- Movable Typeのダイナミックパブリッシングでのページ分割ナビゲーションの不具合を解消する
- Movable Type 5のダイナミックパブリッシングでのページ分割について
- Movable Type のページ分割でページ番号を title 要素に表示する
- Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む(改)
- ダイナミックパブリッシングによるページ分割
- コメントのページ分割 for Movable Type 4
- PageBute プラグインによるページ分割
- Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む
- アーカイブページのページ分割 for Movable Type 4.1
- メインページのページ分割 for Movable Type 4
- 検索結果のページ分割(3.3x 版)
≫ MTのPHP化とページ分割 from 八代目日記
今更ですが、MTで作ってるページを全てPHP化しました。 ちゅうのは、祇園観光案... [続きを読む]
≫ ダイナミックパブリッシング化&PHP化 from ムジログ
Movable Typeにしてから最も不満だったのが、再構築の時間が長いという... [続きを読む]
yujiroさま。こんにちわ。いつもお世話になっております。
<!-- /content -->とは、何処の場所にあるのでしょうか?
それと<div id="content">とは・・・
メインページ・ウェブページ・ブログ記事・ブログ記事リストそれぞれに
ありますが・・・全部に<!-- AjaxStart -->を挿入した方が
いいのでしょうか?
また初歩的の質問だとは思いますが(^▽^;)
ご指導を宜しくお願い致します。
>アプルさん
こんにちは。
ご質問の件ですが、この記事はMT3の時に書いたものですので、MT4の配布テンプレートには
<!-- /content -->
はありません(先ほど削除しました)。
また、埋め込むテンプレートは、折りたたみを行いたいページに対応するテンプレートに設定すればOKです。
ただし、複数ブログ記事を表示しない「ブログ記事」や「ウェブページ」に設定を行っても意味がないので、対応するのは「メインページ」か「ブログ記事リスト」のいずれかになると思います。
それではよろしくお願い致します。
yujiroさま。こんにちわ。いつもお世話になっております。
早速のご指導をありがとうございます。
「メインページ」か「ブログ記事リスト」の両方へ入れても
何もなりません。どちらか1つでも同じ状態です。
MTPaginate.pmプラグインは、利用可能(無効化)で
いいのですよね?
またご指導を宜しくお願い致します♪
>アプルさん
こんにちは。
ご質問の件ですが、ページ分割の設定はお済みでしょうか。再度ご確認頂ければ幸いです。
なお、このカスタマイズは冒頭に記してます通り、案レベルの内容ですので、予めご承知ください。
それではよろしくお願い致します。
yujiroさま。こんにちわ。いつもお世話になっております。
お返事が遅れてしまいすいません(^▽^;)
ページ分割をしていませんでした。ページ分割をする事で
と表示するようになりました。
ありがとうございました♪
これからも宜しくお願い致します。
何かと忙しくなるこの時期・・・体調にはお気をつけ下さい。
こんばんわ><
また少し お伺いします
今回 メインページをページ分割 Ajax化してみたのですが
表示がまえと 少しちがってきてしまっています
右サイドバーの表示が少しおかしくなったのです
ウィンドウを縮小表示してみるとよくわかるのですが。。。
わたしのやりかたが おかしかったのかどうか 不明なので><
表示がおかしくなるのは Ajax化した メインページのみで
ほかの月別カテゴリーなどや エントリーのタイトルなどから 表示させるとふつうなのですが
これとおなじように 表示させることはできますか?
Ajax化しないで ページ分割だけの場合はきちんと表示されるので もしダメならAjax化はやめようとおもいます なおせるなら直してみようかなと思っています
解りづらい説明ですみません><
HPみてもらえばわかるとおもうので お時間あるときに よろしくお願いいたします
すいません
上記の追加です
Opera Mozilla Firefox では表示は きちんとされてるようですが
IE7でみると、、、、表示がおかしいです
よろしくお願いします
>ましゅさん
こんにちは。
ご利用ありがとうございます。
確認ですが、「右サイドバーの表示が少しおかしい」というのはIE7のみでしょうか。またどのようにおかしいかを「ウィンドウを縮小表示」と併せて具体的にお知らせ頂ければ幸いです。
またこのカスタマイズは冒頭に記してます通り、案レベルなのでご要望にお応えできない可能性がありますので予めご容赦ください。
なおサンプルではIE7でも動作しているようですので、基本的な設定での問題はないように思われます。
それではよろしくお願い致します。
お返事ありがとうございます
一応確認したところ 上記でものべましたが Opera Mozilla Firefoxでは
もんだいないようです
IE7では縮小表示したとき右サイドバーが エントリー記事とかぶってしまっています それと 右サイドバーの サイドタイトルなどが なぜか サイドバーのボーダーぎりぎりに表示されてしまっています
リキッドレイアウトなのでそれは なにか関係あるのでしょうか、、、、
お手を和ずれ早生手申し訳ありません アドレスはいっているので 一度確認していただければ うれしいです うまく説明できてないので><
お手すきのときに よろしくおねがいします
すいません
いろいろ いじってみたのですが どうにもうまくいかず
リキッドレイアウトのせいでは?とおもい ふつうの 3カラムにデザイン変更してみたとこ
なぜか サイドバーがブログ記事(中央カラム)の下に表示されてしまうという事態になってしまい わかけが わからくなってしまいました;;
リキッドにすると サイドバーは右に表示されるのですが、、、、
頭がこんがらがってきたので 3カラムリキッドにもどし
メインページの分割化のみにもどしました;;
いろいろ お手数かけましたが これで問題ないのでこれで行こうかと考えています
いろいろカスタマイズしているのが関係しているのか わたしの設定ミスなのか不明なのですけど。。。
なんども コメントして すみません
一応 トップページのみを 分割化して 3カラムにもどしたときの症状
(サイドバーがエントリー記事の下に表示される)は
http://mashyu.sakura.ne.jp/newで みれるようにしておきましたので
お手すきのときに 確認してわかることがあればよろしくお願いします
公開してるブログは上記のコメントのように ページ分割リキッドでしばらく様子みるつもりですので お返事はほんとに お手すきの時で結構です^-^
いつもいつも もうしわけありません
>ましゅさん
こんばんは。
ご質問の件ですが、
<div class="paginate">
に対応するdivの終了タグがありません。
なお、レイアウト崩れが発生した場合はマークアップ誤りがほとんどですので、Another HTML-lint gatewayで確認されることをお勧めします。
それではよろしくお願い致します。
こんばんわ
お返事ありがとうございます
yujiroさんのご指摘で テンプレートを いろいろみなおしたところ
ページ分割する際にメインページに挿入する
</div>
</MTPaginateIfMultiplePages>
</MTPaginate>
の</div>をもともとある</div>と勘違いしておりました><
それをなおしたところ 3カラムでも きちんと 表示されました
それと ききたいののですが Ajax化するのに
挿入する
<!-- AjaxEnd -->
</div>
はこの
</div>
</MTPaginateIfMultiplePages>
</MTPaginate>
のところでしょうか? それともその下の行にあるもともとあった</div>のとこですか?
一応もともとあったところに挿入して4項のscriptをヘッダーに記述しましたがそれであっていますでしょうか?
一応機能していますがちゃんとAjax化されてるのどうかとかよくわからないので^^;
>ましゅさん
こんばんは。
ご質問の件ですが、MTPaginateIfMultiplePagesのすぐ上のdiv終了タグではありません。
言い換えると、
<div id="content">
に対応したdiv 終了タグです。
話がかみ合っていなかったらすいません。
それではよろしくお願い致します。
こんばんわ
いつもいつも 丁寧にお返事ありがとうございます
お返事の内容からすると たぶんわたしが挿入した場所であってるようなので
なんtか安心しましたw
ほんとに いつもお世話になってばかりで申し訳ないです
これからも ヘンなご質問するかもですが どうぞよろしくです^-^
yujiro様にとって 素敵なクリスマスがすごせますように^-^
「Merry Christmas!」そして これからもよろしくおねがします_(._.)_
>ましゅさん
こんばんは。
ご連絡ありがとうございました。
ではでは!