MTがなぜ大規模なテンプレートエンジンとアーカイブエンジンを持つに至ったかというと、全てはMTEntriesを動かすためといっても過言ではありません。 MTEntriesを制するものはテンプレートを制す、と言っても良いでしょう。 というわけで、MTEntriesのMT4.01での実装を、細かく調べてみました。 以下、MTEntriesの内部動作について気をつけたい点を一通り確認した後、実際のコードの流れを追う形で具体的な処理の詳細を見てみます。 概観 コンテキスト MTEnriesの行う重要な動作の一つに、モディファイアやコンテキストの指定をもとに、表示するべきエントリーを絞り込むことがあります。 コンテキストから読み取る情報については、以下の2種類に分類することが出来ます。 具体的なエントリー一覧として設定されているもの(キャッシュ) アーカイブに含まれるエントリーや、MTEntriesの外側のブロックタグで絞り込み済みのエントリーなど、直近の物が$ctx->{stash}{entries}に格納されています。 ロード済みの(メモリに格納された)エントリーの実体がある場合と、MT::Promiseによって、ロード内容をコードとして持っているが実行していない場合があります。 日付の範囲やカテゴリーなど、絞込みの条件指定 たとえば月別アーカイブでは、月の始まり 20071101000000 と月の終わり 20071130235959 が設定されています。 class MT4から導入された「ウェブページ」機能で作成されたページは、内部的にはエントリーとして保存されています。そのため、MTEntriesで扱おうとしているエントリーが、本当にエントリーなのか、それともウェブページとして作成されたものなのかを判別するためにclassという概念が導入されています。MTEntriesにはclassを判断するためのルーチンが含まれています。 フィルタ 各種絞込み条件は、「フィルタ」という形で適用されます。 フィルタは各種の条件に合わせて作成され、フィルタ一覧に格納されます。 そして、事前に用意された、表示候補となるエントリー一覧をフィルタリングします。候補中の各エントリーそれぞれに対してテストを行い、全てのフィルタを通過したエントリーのみを、実際に表示するエントリーとして登録する仕組みになっています。 動作の流れと詳細 大まかな動作の流れとしては、以下のようになります。 コンテキストとモディファイアを調整 フィルタを作成 エントリーの読み込み フィルタリング ソート ブロック内部をビルド ではいきます。 コンテキストとモディファイアを調整 いわゆる事前準備ですね。枝葉末節までだーっと箇条書きにしておきます。 最初に、sort_byモディファイアにscoreが指定されているにも関わらず、namespaceモディファイアが無い場合、エラーを発生させて終了する、という処理があります。 続いて、複数ブログの指定を展開します。blog_id、blog_ids、include_blogs、exclude_blogsなどのモディファイアが絞込み条件に適用されます。問題があった場合はエラーを発生させて終了します。 以下の条件を満たしている場合、キャッシュを破棄します。 class_typeモディファイアでのclassの指定と、キャッシュされているエントリーのclassが異なっている場合 次のモディファイアのうちのいずれかが指定されている場合('category', 'categories', 'tag', 'tags', 'author', 'id', 'days', 'recently_commented_on', 'include_subcategories') ここで内部動作的な処理として、テンプレート上でのoffset指定がautoで、かつ再構築実行時のCGIのクエリにoffsetという指定があったら、cgiのクエリを反映させるという処理が入ります。 モディファイア「limit」の値がautoなら、ブログの設定にある「ブログ記事の表示数」を絞込み条件に反映させます。また、limitにauto以外の指定があった場合は、モディファイアlastnをlimitの値で上書きします。 この時点でキャッシュが存在しない、かつモディファイア「category」が設定されていない場合、コンテキストにカテゴリーの設定があると絞込条件に反映されます。(モディファイア「categories」は見ない) フィルターの作成 カテゴリ カテゴリのフィルタを作成します。以下の優先順位で指定が存在するかを検査していき、最初に見つかった指定に基づいてカテゴリーのフィルタが作成されます。 モディファイアcategory の指定 コンテキストの mt_categories の指定 コンテキストの archive_category の指定 モディファイア categories の指定 モディファイア「category」「categories」には「AND」「OR」「NOT」を使った複数の条件が指定できます。 タグ 続いてタグによるフィルタの作成です。 モディファイア「tag」または「tags」の指定があれば、タグフィルタを作成します。重複して指定がある場合は「tag」の指定のみが有効になります。 モディファイア「tag」または「tags」には、「AND」「OR」「NOT」を使った複数の条件が指定できます。...