第 2 章 Movable Typeを 構 成 するデータを 読 み 込 む ブログ 記 事 のオブジェクト(MT::Entry)の 操 作 ブログを 構 成 するオブジェクトの 中 で ブログ 記 事 (MT::Entry)はもっともよく 操 作 するオブジェクトです この 節 では ブログ 記 事 のオブジェクトを 操 作 する 方 法 を 解 説 します ブログ 記 事 の 情 報 をオブジェクトに 読 み 込 む まず ブログ 記 事 の 情 報 をオブジェクトに 読 み 込 む 方 法 を 解 説 します ブログのオ ブジェクト(MT::Blog)と 同 様 に 読 み 込 みはMT::Entryクラスのloadメソッドで 行 い ます MT::Entryクラスを 使 うことを 宣 言 する プログラムの 中 でブログ 記 事 のオブジェクトを 操 作 する 場 合 その 前 に 以 下 の 一 文 を 入 れて MT::Entryクラスを 使 うことを 宣 言 します use MT::Entry; loadメソッドの 書 き 方 MT::Entryクラスに 限 らず Movable Typeの 各 種 の 情 報 をオブジェクトに 読 み 込 む 際 には それぞれのクラスのloadメソッドを 使 います loadメソッドの 基 本 的 な 書 き 方 は 以 下 のようになります 1 書 き 方 その1 クラス 名 ->load(オブジェクトのid) 1 書 き 方 その2 クラス 名 ->load( 検 索 条 件, パラメータ) クラス 名 には 読 み 込 みたいオブジェクトのクラス 名 を 指 定 します たとえば ブログ 記 事 をオブジェクトに 読 み 込 むなら クラス 名 は MT::Entry とします - 70 -
ブログ 記 事 のオブジェクト(MT::Entry)の 操 作 1つのオブジェクトだけを 読 み 込 む 場 合 は 前 述 の1つ 目 の 書 き 方 を 使 います この 場 合 loadメソッドのパラメータとして そのオブジェクトのIDを 指 定 します 一 方 複 数 のオブジェクトを 一 度 に 読 み 込 む 場 合 は 2つ 目 の 書 き 方 を 使 います この 場 合 は 検 索 条 件 等 を 指 定 して 読 み 込 むオブジェクトを 検 索 します 検 索 条 件 では 主 に プロパティの 値 が である という 形 で 検 索 す るオブジェクトの 条 件 を 指 定 します プロパティ 名 と 検 索 する 値 の 組 を ハッシュの キーと 値 として 表 わし そのハッシュのリファレンスを 検 索 条 件 の 部 分 に 指 定 し ます ブログ 記 事 をオブジェクトに 読 み 込 む 場 合 表 2.3のようなプロパティを 指 定 す ることができます 1つのハッシュに 複 数 の 条 件 を 指 定 することもできます その 場 合 それらすべての 条 件 を 満 たすブログ 記 事 が 読 み 込 まれます また パラメータ の 部 分 には 並 べ 替 えの 方 法 や 読 み 込 むオブジェクトの 数 な ど オブジェクトを 読 み 込 む 際 のパラメータを 指 定 します パラメータの 名 前 と そ のパラメータに 渡 す 値 の 組 を ハッシュのキーと 値 の 組 として 表 わします そして そのハッシュのリファレンスを 渡 します 表 2.3 ブログ 記 事 のオブジェクトの 主 なプロパティ プロパティ id blog_id author_id status authored_on created_on modified_on title text text_more excerpt comment_count ping_count basename allow_comments allow_pings 内 容 ブログ 記 事 のID ブログ 記 事 が 属 するブログのID ブログ 記 事 を 書 いたユーザーのID ブログ 記 事 の 公 開 状 態 ( 下 書 き/ 公 開 など) ブログ 記 事 の 日 時 (ブログ 記 事 の 編 集 画 面 の 公 開 日 で 指 定 した 日 時 ) ブログ 記 事 を 始 めて 保 存 した 日 時 ブログ 記 事 を 最 後 に 更 新 した 日 時 ブログ 記 事 のタイトル ブログ 記 事 の 本 文 ブログ 記 事 の 追 記 (ブログ 記 事 の 編 集 画 面 の 続 き の 欄 に 入 力 した 内 容 ) ブログ 記 事 の 概 要 ブログ 記 事 についたコメントの 数 ブログ 記 事 についたトラックバックの 数 ブログ 記 事 のファイル 名 ブログ 記 事 にコメントをつけられるかどうか ブログ 記 事 にトラックバックをつけられるかどうか - 71 -
第 2 章 Movable Typeを 構 成 するデータを 読 み 込 む 特 定 のブログのブログ 記 事 を 読 み 込 む 検 索 条 件 と パラメータ の 具 体 的 な 指 定 方 法 の 例 をいくつか 紹 介 します ま ず 特 定 のブログに 属 するブログ 記 事 を 読 み 込 む 方 法 から 解 説 します この 場 合 load メソッドの 検 索 条 件 として 以 下 のようなハッシュリファレンスを 渡 します なお loadメソッドの パラメータ の 部 分 は 指 定 しません { blog_id => ブログのID } たとえば IDが1 番 のブログから ブログ 記 事 をすべて 読 み 込 みたいとします そし て 読 み 込 まれたブログ 記 事 のオブジェクト 群 を 配 列 @entriesに 割 り 当 てたいとし ます この 場 合 loadメソッドを 以 下 のように 書 きます @entries = MT::Entry->load({ blog_id => 1 }); 公 開 されているブログ 記 事 のみ 読 み 込 む ブログ 記 事 を 読 み 込 んでその 情 報 を 一 般 向 けに 出 力 する 場 合 未 公 開 や 日 時 指 定 に なっているブログ 記 事 の 情 報 は 通 常 は 出 力 すべきではありません このようなとき には 公 開 されているブログ 記 事 だけを 読 み 込 むと 良 いです ブログ 記 事 の 公 開 状 態 は statusプロパティで 表 されます このプロパティは 表 2.4 の 定 数 のいずれかの 値 を 取 ります loadメソッドの 検 索 条 件 に status => 公 開 状 態 の 条 件 を 追 加 すると その 条 件 を 満 たすブログ 記 事 だけを 読 み 込 むことができます たとえば IDが1 番 のブログから 公 開 されているブログ 記 事 だけを 読 み 込 んで 配 列 @entriesに 割 り 当 てるには リス ト2.5のように 書 きます リスト2.5 IDが1 番 のブログから 公 開 されているブログ 記 事 を 読 み 込 む 01 @entries = MT::Entry->load({ blog_id => 1, 02 status => MT::Entry::RELEASE() }); - 72 -
ブログ 記 事 のオブジェクト(MT::Entry)の 操 作 表 2.4 ブログ 記 事 の 公 開 状 態 を 表 す 定 数 定 数 公 開 状 態 MT::Entry::HOLD() 未 公 開 ( 下 書 き) MT::Entry::RELEASE() 公 開 MT::Entry::REVIEW() レビュー MT::Entry::FUTURE() 日 時 指 定 一 定 期 間 のブログ 記 事 のみ 読 み 込 む ブログでは 記 事 を 月 別 や 年 別 などの 一 定 期 間 に 分 けて 扱 うこともあります プロ グラムでこのような 処 理 を 行 うには 一 定 の 期 間 に 公 開 されたブログ 記 事 のみ 読 み 込 むことが 必 要 になります ブログ 記 事 の 日 付 を 表 すプロパティとして authored_on/created_on/ modified_onの3つがあります ブログ 記 事 の 編 集 画 面 で 日 付 として 入 力 する 値 は authored_onプロパティに 対 応 します したがって 一 定 期 間 のブログ 記 事 のみ 読 み 込 むには 一 般 的 にはauthored_onプロパティの 値 で 期 間 を 指 定 します loadメソッドの 検 索 条 件 の 書 き 方 は 表 2.5のようになります 開 始 日 時 / 終 了 日 時 とも 14 桁 の 数 値 ( 年 は4 桁 月 日 時 分 秒 はそれぞれ2 桁 )で 表 します たとえば 2009 年 1 月 23 日 1 時 23 分 45 秒 は 20090123012345 と 表 します また 期 間 を 指 定 して 記 事 を 読 み 込 む 場 合 loadメソッドのパラメータに range => { authored_on => 1} または range_incl => { authored_on => 1} を 指 定 します rangeの 場 合 authored_onプロパティの 値 が 開 始 日 時 より 大 きく 終 了 日 時 より 小 さい 記 事 が 読 み 込 まれます 開 始 日 時 / 終 了 日 時 はぴったりの 記 事 は 読 み 込 まれませ ん 一 方 range_inclの 場 合 開 始 日 時 / 終 了 日 時 にぴったりの 記 事 も 読 み 込 まれま す 例 えば 以 下 の 条 件 をすべて 満 たすブログ 記 事 を 読 み 込 んで 配 列 @entriesに 割 り 当 てるとします 1IDが1 番 のブログに 属 する 2 公 開 されている 32009 年 1 月 中 (2009 年 1 月 1 日 0 時 0 分 0 秒 ~2009 年 1 月 31 日 23 時 59 分 59 秒 )に 書 いた この 場 合 リスト2.6のように 書 きます - 73 -
第 2 章 Movable Typeを 構 成 するデータを 読 み 込 む 表 2.5 期 間 を 指 定 してブログ 記 事 を 読 み 込 む 場 合 の 検 索 条 件 の 書 き 方 条 件 loadメソッドの 検 索 条 件 の 書 き 方 開 始 日 時 と 終 了 日 時 の 間 のブログ 記 事 を authored_on => [ 開 始 日 時, 終 了 日 時 ] 読 み 込 む 開 始 日 時 から 後 のブログ 記 事 を 読 み 込 む authored_on => [ 開 始 日 時 ] 終 了 日 時 より 前 のブログ 記 事 を 読 み 込 む authored_on => [ undef, 終 了 日 時 ] リスト2.6 日 付 を 指 定 してブログ 記 事 を 読 み 込 む 01 @entries = MT::Entry->load({ blog_id => 1, 02 status => MT::Entry::RELEASE(), 03 authored_on => [ 20090101000000, 04 20090131235959 ] }, 05 { range_incl => { authored_on => 1 } }); ブログ 記 事 を 並 べ 替 える ブログ 記 事 を 読 み 込 む 際 に プロパティの 値 によって 並 べ 替 えたいこともあります たとえば ブログ 記 事 を 日 付 の 新 しい 順 に 並 べ 替 えるような 場 合 が 相 当 します この 場 合 loadメソッドの パラメータ の 部 分 に sort => 'プロパティ 名 ' と direction => 'ascendまたはdescend' の2つを 追 加 します ascend/descendはそ れぞれ 昇 順 / 降 順 ( ) を 表 します たとえば IDが1 番 のブログ 記 事 で 公 開 されているものを 日 付 の 新 しい 順 ( 降 順 ) に 読 み 込 みたいとします そして 読 み 込 んだブログ 記 事 を 配 列 @entriesに 割 り 当 て るとします これは リスト2.7のように 書 くことができます リスト2.7 ブログ 記 事 を 並 べ 替 えて 読 み 込 む 01 @entries = MT::Entry->load({ blog_id => 1, 02 status => MT::Entry::RELEASE() }, 03 { sort => 'authored_on', 04 direction => 'descend' }); ( ) 昇 順 / 降 順 値 が 小 さい 順 に 並 べ 替 えることを 昇 順 と 呼 び その 逆 に 並 べ 替 えることを 降 順 と 呼 びます たと えば 1,7,4,3,6 の5つの 数 字 を 昇 順 で 並 べ 替 えると 1,3,4,6,7 になります 一 方 降 順 だと 7,6,4,3,1 になります - 74 -
ブログ 記 事 のオブジェクト(MT::Entry)の 操 作 一 部 のブログ 記 事 のみ 読 み 込 む 多 数 のブログ 記 事 がある 場 合 その 一 部 だけを 読 み 込 みたいこともあります たと えば 最 近 の10 件 のブログ 記 事 を 読 み 込 む といった 場 合 です このときは loadメ ソッドの パラメータ の 部 分 に offset => 記 事 数 や limit => 記 事 数 を 追 加 します offsetは 条 件 に 合 うブログ 記 事 のうち 先 頭 から 指 定 した 件 数 を 飛 ばして その 次 から 読 み 込 むのに 使 います またlimitは 読 み 込 むブログ 記 事 の 件 数 を 指 定 するの に 使 います たとえば 以 下 のようにブログ 記 事 を 読 み 込 んで 配 列 変 数 @entriesに 割 り 当 てた いとします これはリスト2.8のように 書 くことができます 1IDが1 番 のブログに 属 する 2 日 付 の 新 しい 順 に 並 べ 替 える 3 先 頭 の10 件 を 飛 ばし その 次 の5 件 を 読 み 込 む リスト2.8 一 部 のブログ 記 事 のみ 読 み 込 む 01 @entries = MT::Entry->load({ blog_id => 1 }, 02 { sort => 'authored_on', 03 direction => 'descend', 04 offset => 10, 05 limit => 5 }); ブログ 記 事 の 情 報 を 得 る 個 々のブログ 記 事 の 情 報 (タイトルや 本 文 など)は ブログ 記 事 のオブジェクトの プロパティから 得 ることができます 主 なプロパティは 71ページの 表 2.3にあげたと おりです たとえば 変 数 $entryにブログ 記 事 のオブジェクトを 割 り 当 てたとします この 場 合 $entry->title は そのブログ 記 事 のタイトルを 表 します また $entry->text はブログ 記 事 の 本 文 を 表 します ブログ 記 事 の 情 報 を 表 示 する 例 リスト2.9は IDが1 番 のブログから 公 開 されている 最 近 のブログ 記 事 を10 件 読 み 込 んで そのタイトルと 日 付 を 表 組 みで 出 力 する 例 です( 画 面 2.3) 主 な 行 の 内 容 は - 75 -
第 2 章 Movable Typeを 構 成 するデータを 読 み 込 む 以 下 の 通 りです 11 行 目 :use MT::Entry; MT::Entryクラスを 使 うことを 宣 言 します 15~9 行 目 :my @entries = MT::Entry->load( ); loadメソッドを 使 って IDが1 番 のブログから 公 開 されている 最 近 のブログ 記 事 を 10 件 読 み 込 む 処 理 を 行 っています このプログラムの 中 心 的 な 処 理 です IDが1 番 のブログ 公 開 されている という2つの 条 件 から loadメソッドの 検 索 条 件 の 部 分 は blog_id => 1 と status => MT::Entry::RELEASE() になります また 最 近 の ということから ブログ 記 事 は 日 付 の 新 しい 順 ( 降 順 )に 並 べ 替 え ます したがって loadメソッドの パラメータ の 部 分 に sort => 'authored_on' と direction => 'descend' の 記 述 が 必 要 です さらに 読 み 込 む 記 事 数 は10 件 ですので loadメソッドの パラメータ の 部 分 に limit => 10 も 追 加 します 210 行 目 :for my $entry (@entries) { 読 み 込 んだブログ 記 事 群 ( 配 列 @entries)から ブログ 記 事 を1つずつ 順 に 取 り 出 し 繰 り 返 しを 行 います 312 行 目 :print '<td>'. $entry->id. '</td>'; ブログ 記 事 ($entry)のidプロパティを tdタグで 囲 んで 出 力 します idプロパテ ィはブログ 記 事 のIDを 表 します 413~14 行 目 10 行 目 と 同 じ 要 領 で ブログ 記 事 のタイトル(titleプロパティ)と 日 付 (authored_onプロパティ)を 出 力 します なお authored_onプロパティは14 桁 の 数 値 になっていて そのままではやや 読 みづ らいです MT::Util というモジュールの 関 数 を 使 うと 2009 年 01 月 23 日 12 時 34 分 56 分 のように 書 式 づけることもできます これについては 213ページで 解 説 します なお リスト2.9を 含 むインデックステンプレートのサンプルファイルは part2 フォルダの entry1.tmpl です リスト2.9 ブログ 記 事 の 情 報 を 表 示 する 例 01 use MT::Entry; 02 03 print '<table border="1">'; 04 print '<tr><th>id</th><th>タイトル</th><th> 日 付 </th></tr>'; - 76 -
ブログ 記 事 のオブジェクト(MT::Entry)の 操 作 05 my @entries = MT::Entry->load({ blog_id => 1, 06 status => MT::Entry::RELEASE() }, 07 { sort => 'authored_on', 08 direction => 'descend', 09 limit => 10 }); 10 for my $entry (@entries) { 11 print '<tr>'; 12 print '<td>'. $entry->id. '</td>'; 13 print '<td>'. $entry->title. '</td>'; 14 print '<td>'. $entry->authored_on. '</td>'; 15 print '</tr>'; 16 } 17 print '</table>'; 画 面 2.3 リスト2.9の 実 行 結 果 の 例 前 後 のブログ 記 事 を 読 み 込 む あるブログ 記 事 を 基 準 にして 日 付 順 で 前 後 の 記 事 を 得 たい ということもありま す これは ブログ 記 事 のオブジェクトの next と previous というメソッドで 得 ることができます たとえば あるブログ 記 事 を 変 数 $entryに 割 り 当 てているとします この 場 合 以 下 のようにすると 変 数 $nextは1つ 次 のブログ 記 事 を 指 すオブジェクトになります $next = $entry->next; - 77 -