七転び八起きブログ

Moblog設置ドキュメンタリー[その3]

2005年01月11日   :: CGI

さて、続いてMT; MT::Entry; MT::Blog; MT::Image;あたりの確認をしなければ…よく考えたらまだ料理で言ったら下ごしらえが終わってない段階なんだよなぁ('A`)

これらのモジュールはMovableType Perl APIと呼ばれるものらしいです。
APIのマニュアルは日本語版は無いですが、本家のものがあります。
 #MT API index - Index of MT API documentation
 
また、日本の方には『Blog Hacks』作者の一人でもある伊藤直也氏の解説記事が、開発者用ブログの方にあります。これは大変役に立ちそう…。多謝。
 #Techknow Movable Type: Movable Type Perl API Hacks その1 - MT API の基礎
 

それでは、ひとまず親玉っぽいMTから覗いて見ることに。
ちなみに昔のはこちら。

 #Moblog設置ドキュメンタリー[その2]::[7korobi8oki.com]
 #Moblog設置ドキュメンタリー[その1]::[7korobi8oki.com]

一応今回でモジュールの読み込みは終了予定。

MT - Movable Type

概要にはMTクラスは、MT関連ライブラリーの上位のクラスです。このライブラリは全てのリビルド作業をします。他のMTの機能はMT::AppとかMT::App::CMS等を使います。とあります。また、MT関連のモジュールを使用する場合は、まずはこのモジュールで対象のMTを読み込むのが普通な予感。

my $mt = MT->new( Config => "/usr/local/MT/mt.cfg" );

で、インスタンスを作成。この時自動的にカレントディレクトリからmt.cfgを探して設定を読み込みます。もしmt.cfgがデフォルトと違うところにある場合は、Configでディレクトリを指定します。これで、$mtというMTインスタンスを通じて、対象のブログを操作することが出来るようになります。

つづいてリビルド関連。

$mt->rebuild(
      BlogID => $blog_id,
      EntryCallback => sub { printf "%d/%d\r", ++$i, $total },
      # [Option]
      # ArchiveType => ( Individual | Daily | Weekly | Monthly | Category ) ;
      # NoIndexes => ( true | false ) ;
      # Limit => NUM ;
      # Offset => NUM ;
);


こんな感じにすると、$blog_idに対応するブログを(IDはMTの管理画面で確認)リビルドし、コールバックでサブルーチンを呼び出します。この場合は、何番目の記事が現在リビルド中なのか出力されるはず。

また、どのアーカイブをリビルドするかとか、インデックステンプレートをリビルドするかどうか等オプションがあるようです。

ArchiveType : リビルドしたいアーカイブタイプを指定。
NoIndexes : インデックステンプレートをリビルドするか。
Limit : リビルドを最後のNUMエントリーにしぼることができる。
Offset : MTのタグと同じで、最後のNUM個をリビルドしないことができる。

リビルドはエントリー単位で行うことも出来ます。この辺は MT::Entry で。テンプレートのリビルドもMT::Templateで。ちなみに、どちらもそれぞれのオブジェクトを引数に取って、$mt->rebuild_entry( %args )
とか$mt->rebuild_indexes( %args )とかすればOKそうです。

また、他にも色々あります。
text filterとか。プラグイン作るときに出てきたグローバルフィルターとか絡みだろうか。しかし結構シンプルにまとまっていてなんかワクワクしますな。今のうちにワクワクしておこう。どうせそのうち土ツボに嵌まるだろうし。

MT::Entry - Movable Type entry record


MT::Entryは、MTドキュメントのMT::EntryのDESCRIPTIONによると、これを通じてエントリーの本文とさらに作者やカテゴリーなどのメタデータを操作できるもののようです。MT::Entryは、MT::Objectのサブクラスなので、基本的な部分はMT::Objectから継承しています。なので、まずはMT::Objectを見てみることに。

MT::Objectは、MTが蓄積しているデータをあらわすクラスらしい(何かうまく日本語に出来ない)普通はそれはRDBに置いてある。SQLとか。BerkleyDBとか。MTは基本的にはデータがどのようなメカニズムで、技術で蓄積されているかについては全く関知せず、そこにどんな名前(?)のデータが入っているかだけ知っているようです。

んで、実際のデータ蓄積メカニズムは、MT::ObjectDriver 次第だそうで。
このように独立させていることで、色々なデータベースに対応できているそうな。


このMT::Objectをベースにして、いくつか独自のメソッドやらを付け加えたのがMT::Entry。なので、MT::Entryに載ってないメソッドとかがあったら、MT::Objectにさかのぼって調べればよさげ。スーパークラスって奴ですか。MT::Objectについてはそれ以上今回は突っ込まない予定。突っ込む前にクラスとか復習しないと玉砕必至('A`)

エントリーを投稿する場合

と言うわけでMT::Entryに戻ります。エントリー投稿までのサンプルスクリプトはこんな感じで書かれています。
 #コードはMT::EntryのSYNOPSISから引用


use MT::Entry;

#MT::Entryインスタンス生成

my $entry = MT::Entry->new;


#エントリー対象のブログIDを指定

$entry->blog_id($blog->id);


#Publishなら2、Draftなら1を指定。しかしMT::Entry::RELEASEサブルーチンて何…?

$entry->status(MT::Entry::RELEASE());

#検索しても出てこないのでとりあえずMTの中のEntry.pmを見ると
# use constant HOLD => 1;
# use constant RELEASE => 2;
# use constant REVIEW => 3;
# use constant FUTURE => 4;
#とあった。定数か。けどなんで()が付いてるんだ…。

#author_idメソッドで$author->idは、MT::Authorクラスのメソッド。

$entry->author_id($author->id);


#各データを入力

$entry->title('My title');
$entry->text('Some text');


#MT::Objectのsaveメソッド。DBにセーブする。
$entry->save
or die $entry->errstr;


その他にもMT::Entryには色々とメソッドがあるようですな。多いのは、既存のエントリーから情報を引っ張ってきたり、編集したりすることだと思うので、ちょっとその辺りをついでに探ってみたいと思います。

エントリーから色々読み出してくる場合


まずは、さっき作ったようなMT::Entryインスタンスを読み込んできます。loadメソッドを使います。まずは基本形。

my @objects = CLASS->load(\%terms, \%arguments);

この中で、CLASSはここではMT::Entryです。\%termsは、この場合EntryIDを入れれば、エントリー単品が対象になります。BlogIDを入れると、エントリーのリストが返ってきます。

\%argumentsは、様々なオプション(direction => "ascend|descend" 、limit => "N"等など。MT::ObjectのLoading an existing object or objects辺りを参照)

なので例えばブログのタイトル一覧を10件出力するには

my $mt = MT->new() ;
my @entryArray = MT::Entry->load(
            { blog_id => 1 },
             { sort => 'created_on',
            direction => 'descend',
            limit => 10 }
                         );

foreach my $tmp ( @entryArray ){
printf("%s\n", $tmp->title);
}

と言う感じでエントリーを読み込んで、作成日時で (sort => 'created_on')、降順 (direction => 'descend')に。10件分のタイトルを出力できます。このあたりはTechknow Movable Type: Movable Type Perl API Hacks その1 - MT API の基礎にしっかり載っていました。ありがたや。ちなみにMTインスタンスは、明示的にConfigでmt.cfgの場所を指定しておいたほうがよさげです。


また、例えばオブジェクト(エントリー)の数を数えるにはこんな感じ。

my $count = MT::Foo->count( { blog_id => 1 });

他にもありそうですが、今回はこんな感じで。ちなみにこのMT::Objectのloadメソッドはエントリーから情報を読み出すほかにも、MT::BlogやMT::TemplateやMT::Author等のインスタンスといった、MT::Objectを上位のクラスに持つものから情報を引き出せます。

MT::Imageは、$img->scale(%arg)くらいなので、まぁなんとかなるかな、と言う感じでパス。というわけでようやくモジュール終わり('A`)


連休中に終わると思った自分が馬鹿だった…。

■トラックバック

このエントリーのトラックバックURL:
http://www.7korobi8oki.com/mt/mt-tb.cgi/13

» バイクメカニズム&メンテナンス from 車とバイクの情報館
大切にしている愛車だからこそ、正しい作業内容に基づいたメンテナンスをしてやりたい…。ライダーのそんな声に答えるべく、バイクに乗る前の基礎知識からメカニズム、メン... [続きを読む]

トラックバック時刻: 2007年03月26日 23:40

■コメントはこちらから

サイン・インを確認しました、 . さん。コメントしてください。 (サイン・アウト)

(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


情報を登録する?


mail TOP