「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」の続編にあたり、PHPの「データ構造」(配列とオブジェクト)について解説します。
配列やオブジェクトは、頭の中で考えるだけでは、イメージがつかみにくいです。本書では図を多用して、配列やオブジェクトをなるべく分かりやすく解説することを心がけました。
Kindle本で、定価250円です。
Movable Type 5β4でのページ送りの不具合と修正
Movable Type 4.3(現状では日本語版なし)で、メインページやカテゴリアーカイブページ/月別アーカイブページ等に、ページ送りの機能を付けることができるようになりました。
1ページ目は静的に再構築し、2ページ目以降はアクセスがあった時点で動的に再構築する方法です。
また、ページ送りは検索(mt-search.cgi)の機能を流用して作られています。
Pagination for Static Templates(MOVABLE TYPE.ORGの記事)
このページの解説に沿って、Movable Type 5.0β4で、メインページおよびアーカイブページのページ送りを試してみました。
しかし、一部不具合があり、完全には動作しませんでした。
その修正法を紹介します。
シックス・アパートにもフィードバックしておきました。
10月26日 15時40分
FogBugzのリストにこの不具合が掲載されました。
FB: Pagination of Main Index
FB: Pagination doesn't work on original archive template
1.メインページでの問題とその修正
メインページのテンプレートをページ送りできるように書き換えて再構築し、実際にページ送りを行うと、以下のエラーがWebブラウザに表示されます。
Can't call method "template_params" on an undefined value
検索処理の本体(MT_DIR/lib/MT/App/Search.pm)のソースを見てみると、682~683行目が問題の原因であることが分かりました。
以下のように書き換えると、エラーが出なくなりました。
・書き換え前
my $params = $archiver->template_params; map { $ctx->var( $_, $params->{ $_ } ) } keys %$params;・書き換え後
if ($archiver) { my $params = $archiver->template_params; map { $ctx->var( $_, $params->{ $_ } ) } keys %$params; }
書き換え前のプログラムだと、インデックステンプレートでは$archiverは存在しないので、template_paramsメソッドを実行できず、エラーが起こります。
そこで、$archiverが存在するときだけ、処理を行うように変えています。
2.アーカイブテンプレートでの問題
既存のアーカイブテンプレートを書き換えた場合は動作しましたが、新たにアーカイブテンプレートを作ってページ送りの機能を入れると、ページ移動のリンクをクリックした際に、Webブラウザに以下のエラーメッセージが表示されました。
テンプレートはインデックスでないアーカイブタイプ用の記事リストidを持たなければなりません
MT_DIR/lib/MT/App/Search.pmを見ると、758~759行目に以下の記述があります。
これによると、テンプレートのidentifierプロパティの最後が「entry_listing」で終わっていることが必要です。
しかし、新たに作ったアーカイブテンプレートでは、identifierプロパティに値がありません。
これが問題の原因です。
return $app->errtrans( 'Template must have identifier entry_listing for non-Index archive types' ) unless ($app->config->SearchAlwaysAllowTemplateID || $tmpl->identifier =~ /entry_listing$/ );
phpMyAdminでテンプレート(mt_templateテーブル)を操作し、新規作成したアーカイブテンプレートのidentifierプロパティ(template_identifier列)に「category_entry_listing」の値を指定すると、ページ送りが動作するようになりました。