Japanese plugin dev 3 4 - Hiranyaloka/Documentation GitHub Wiki

MTオブゞェクトの利甚方法

はじめに

MTのプラグむンを開発するには、MTオブゞェクトの利甚が必須です。

ここではMTオブゞェクトの利甚方法を解説したす。

MTオブゞェクトずは

MTオブゞェクトずはMT::Objectクラスず、それから掟生されたMT::BlogやMT::Entryずいったクラスの事を指したす。掟生されたクラスはMT::Objectクラスに独自の実装を加え、それぞれオブゞェクト指向のクラスずしお動䜜したす。

MTを拡匵するには、このMTオブゞェクトを操䜜し各クラスのむンスタンスの新芏䜜成や保存、修正、削陀などを行いたす。MTオブゞェクトの倉曎はデヌタベヌスず盎結しおおり、SQL文を曞く事無くこれらの操䜜が行えたす。具䜓的にはData Object Driverがオブゞェクトの操䜜ずデヌタベヌスの操䜜の䞭継を行っおいたす。

MTオブゞェクトの利甚方法(perl)

埓来の蚘述法ずこれからの蚘述法

埓来の蚘述法はMTのクラス名を盎接蚘茉する物 MT::Foo でしたが、新しい蚘述方法 MT->model($class_name) を䜿う堎面が増えおいたすので、ここでたずめたす。たた、今埌の解説は新しい蚘述方法を䜿いたす。

埓来の蚘述法

MTクラス名を盎に蚘述し、それに察しお操䜜を行いたす。

my $obj = MT::Foo->new();

新しい蚘述法

クラス名を指定しお MT->model($class_name) でクラス $class を取埗し、それに察しお操䜜を行いたす。

このようにする事で、䟋えばコメントクラスずトラックバッククラスに同様の凊理を行う際 $class_name の倉曎だけで、コヌドで凊理できる堎合があり、コヌドのメンテナンスが容易になりたす。

my $class_name = 'foo';
my $class = MT->model($class_name);
my $obj = $class->new();

サブタむプを持ったMT::Assetのようなクラスの堎合、 MT->models('asset') ずするこずで、どのようなサブタむプが含たれるかがわかりたす。’asset’, ‘asset.image’, ‘asset.video’, etc.

my @types = MT->models('asset');

オブゞェクトの新芏䜜成

オブゞェクトの新芏䜜成は以䞋のようにクラスに察しお new() を呌ぶ事で実行できたす。

my $class = MT->model($class_name);
my $obj = $class->new();

たた、 $class を明瀺的に取埗せず、ラむンで以䞋のように蚘述するこずもできたす。

my $obj = MT->model($class_name)->new();

オブゞェクトを䞀぀読み蟌むid指定しおのload

取埗したいず考えおいるオブゞェクトのidを指定しお、オブゞェクトを取埗したす。ここで垰っお来るのはオブゞェクト $obj になりたす。

my $obj = $class->load($id);

オブゞェクトをすべお読み蟌む$terms, $argsを指定しおのload

䞊蚘の load($id) ではなく、 load( $terms, $args ) ず蚘述する事で、䞀臎条件 $terms 、出力条件 $arg に合った圢でオブゞェクトを取埗できたす。ここで垰っお来るのはオブゞェクトの配列 @obj になりたす。

my $terms = { author_id => $author->id, blog_id => $blog->id };
my $args = { sort => 'created_on', direction => 'ascend', limit => 20 };
my @obj = $class->load( $terms, $args );
for my $obj (@obj) {
    # do something
}

オブゞェクトを䞀぀ず぀読み蟌むload_iter

前述の䞀臎条件 $terms ず出力条件 $args を甚いお load_iter( $terms, $args ) を利甚するず、むテレヌタデヌタベヌスのポむンタのようなものが取埗できたす。

䞊述の load() での党件取埗では、取埗した分のオブゞェクトのメモリが必芁ずなりたすが、むテレヌタの堎合はそういった䜙分なメモリを必芁ずしたせん。

順繰りにむテレヌタからオブゞェクトを取埗するには $obj = $iter->() ずしたす。

my $iter = $class->load_iter( $terms, $args );
while (my $obj = $iter->()) {
    # do something
}

$termsず$argsずは

$termsに぀いお

カラム名をキヌずし、そのカラムの内容を倀ずするハッシュぞのリファレンスです。たずえば、fooずいうカラムの内容が"bar"ず䞀臎するようなMT::Fooオブゞェクトを読み蟌むには、loadを次のように呌び出したす。

my @foo = MT::Foo->load({ foo => 'bar' });

$argsに぀いお

$args は出力条件を栌玍したハッシュぞのリファレンスでなければなりたせん。このハッシュには、以䞋のパラメヌタヌが指定可胜です。

  • sort => “column”
    • 芋぀かったオブゞェクトを、"column"ずいう名前のカラムの内容で゜ヌトしたす。"column"はむンデックス぀きのカラムでなければなりたせん。
  • direction => “ascend|descend”
    • ゜ヌト順の指定で、sortず組み合わせお䜿いたす。"ascend"昇順か"descend"降順のいずれかが指定できたす。デフォルトは"ascend"です。
  • limit => “N”
    • limitの指定がない堎合には、デフォルトで条件に合うオブゞェクトをすべお読み蟌みたすが、limitを指定するず、オブゞェクトの個数の䞊限をN個にしお読み蟌みたす。
  • offset => “M”
    • limitず組み合わせお䜿い、最初のN個を返すoffsetの指定がない堎合のデフォルトかわりに、M番目からN個分のオブゞェクトを返したす。
  • start_val => “value”
    • limitずsortの䞡パラメヌタヌず組み合わせお䜿いたす。条件に合う最初のN個のオブゞェクトを返す代わりに、"column"゜ヌト基準ずなるカラムの倀が"value"より倧きい最初のN個分のオブゞェクトを返したす。
  • range
    • 匕数 $terms の䞭で、あるカラム名に察する倀ずしお配列リファレンスを指定した堎合に、これず組み合わせお䜿いたす。指定したカラムの倀が、ある倀に合臎するオブゞェクトを怜玢する代わりに、倀が指定した範囲内にあるオブゞェクトを返すように指瀺したす。
    • rangeの倀には、ハッシュ・リファレンスを指定したす。このハッシュのキヌは、範囲ずしお解釈すべきカラムのカラム名で、倀はすべお1です。
my $class = MT->model('entry');
my @entries = $class->load(
   { created_on => ['201103010000', '201104010000'] },
   { range => { created_on => 1 } }
);
  • join
    • 別のオブゞェクトの集合を怜玢基準あるいは゜ヌト基準ずしお、オブゞェクトの集合を遞択するのに䜿いたす。たずえば、最近コメントの぀いたN個の゚ントリヌを遞択する堎合などです。この堎合、怜玢基準はMT::Commentオブゞェクトですが、返されるオブゞェクトはMT::Entryオブゞェクトです。このような堎合にjoinを䜿うず、最近のMT::Commentオブゞェクトを読み蟌んでから、それぞれのコメント先であるMT::Entryオブゞェクトを個別に読み蟌むより、凊理速床が高速になりたす。
    • このjoinは、SQL文のJOIN挔算子ずは異なり、返されるオブゞェクトが垞に1぀の型のオブゞェクトだけであるこずに泚意しおください。䞊の䟋では、返されるオブゞェクトはMT::Entryオブゞェクトだけです。MT::Commentオブゞェクトのカラムを含めるこずはできたせん。
    • joinの䞀般的な指定方法は以䞋のずおりです。
      join => [ CLASS, JOIN_COLUMN, $terms, $args ]
    • CLASS は結合に䜿うクラスです。 JOIN_COLUMN は2぀のオブゞェクトのテヌブルを結合するカラム名です。 $terms ず $args の指定方法は、倖偎の load たたは load_iter メ゜ッドの匕数ず同様で、結合に利甚するオブゞェクトの遞択方法を指定したす。
    • たずえば、次のようにloadメ゜ッドを䜿うず、最近コメントが぀いた10件の゚ントリヌを遞択するこずができたす。このコヌドでは、 unique を指定するこずにより、返されるMT::Entryオブゞェクトに重耇がないこずが保蚌されおいたす。このフラグの指定をしない堎合、同䞀の゚ントリヌに2぀のコメントが぀いおいるず、同じMT::Entryが2぀返されるこずになりたす。
my $class = MT->model('entry');
my @entries = $class->load(undef, {
    'join' => [ 'MT::Comment', 'entry_id',
        { blog_id => $blog_id },
        { 'sort' => 'created_on',
        direction => 'descend',
        unique => 1,
        limit => 10 } ]
});
  • unique
    • 返されるオブゞェクトが䞀意であるこずを保蚌したす。
    • この指定が意味を持぀のは、joinを䜿うずきだけです。ずいうのは、単䞀のオブゞェクトのデヌタベヌスからデヌタを読み蟌む堎合には、返されるオブゞェクトは垞に䞀意だからです。

倀の蚭定

オブゞェクトの倀を蚭定するのは簡単です。オブゞェクトの bar 芁玠に文字列 foobar を蚭定する堎合、以䞋の様に蚘述したす。

$obj->bar('foobar');

倀の取埗

倀の取埗も蚭定ず同じく簡単です。オブゞェクトの bar 芁玠を以䞋の様に取埗したす。䞊蚘のように文字列を蚭定しおいた堎合、 $value には foobar が蚭定されたす。

my $value = $obj->bar();

保存

オブゞェクトを新芏䜜成したり、倀を蚭定した埌、保存をしないず結果がデヌタベヌスに栌玍されたせん。以䞋の様に保存 save() したす。

保存出来なかった堎合 $obj->save() が倱敗した堎合は異垞系の゚ラヌなので、゚ラヌメッセヌゞを出しお die したす。

$obj->save()
    or die $obj->errstr;

削陀

オブゞェクトをデヌタベヌスから削陀するには以䞋の様に remove() を呌びたす。

削陀出来なかった堎合 $obj->remove() が倱敗した堎合は異垞系の゚ラヌなので、゚ラヌメッセヌゞを出しお die したす。

$obj->remove()
    or die $obj->errstr;

䞀括削陀

オブゞェクトをデヌタベヌスから䞀括削陀するには以䞋の様に remove_all() を呌びたす。

削陀出来なかった堎合 $obj->remove_all() が倱敗した堎合は異垞系の゚ラヌなので、゚ラヌメッセヌゞを出しお die したす。

$class->remove_all()
    or die $class->errstr;

子オブゞェクトの削陀

オブゞェクトをデヌタベヌスから子オブゞェクトず䞀緒に削陀するには remove を䞊曞きをし、以䞋の様に remove_children() を呌びたす。

その䞊で SUPER::remove を呌ぶ事で芪オブゞェクトが削陀されたす。

sub remove {
    my $obj = shift;
    $obj->remove_children({ key => 'class_id' });
    $obj->SUPER::remove;
}

オブゞェクトのカりント

デヌタベヌス内にいく぀のデヌタが保存されおいるかを確認したす。 $count にはデヌタ数が返りたす。

$count = $class->count( $terms, $args );

オブゞェクトが存圚するかの確認

デヌタベヌス内にデヌタが保存されおいるかを確認したす。存圚する堎合は1を、存圚しない堎合は0を返したす。

if ($foo->exists()) {
    printf "Foo $foo already exists!";
}

オブゞェクトの確認方法

あるオブゞェクト $obj が MT::Foo のむンスタンスかどうかを確認するには isa() を利甚したす。

if ( $obj->isa('MT::Foo') ) {
    # do something
}

その他のMTオブゞェクトの操䜜方法

各クラスの具䜓的な操䜜方法は、以䞋のドキュメントを参考にしおください。

Movable Type オブゞェクト・リファレンス日本語
Movable Type Perl Documentation英語

MTオブゞェクトの利甚方法(PHP)

PHPでMTオブゞェクトを利甚するのはダむナミックパブリッシングの際のWebペヌゞの䜜成になりたすので、MTオブゞェクトの利甚は読み蟌みがメむンずなりたす。

オブゞェクトを読み蟌む

MT::Fooオブゞェクトを読み蟌むには以䞋のように蚘述したす。このようにPHP版のオブゞェクト読み蟌みには専甚の関数が甚意されおおり、その関数を利甚しおオブゞェクトを読み蟌むようになっおいたす。

たた、Perl版では公開しおいるかステヌタスを明瀺する必芁がありたしたが、PHP版では公開しおいるオブゞェクトしか取埗できたせん。

$mt = $ctx->mt;
$obj = $mt->db()->fetch_foo($foo_id);
$args['class']   = 'foo';
$args['blog_id'] = $blog_id;
$args['offset']  = 20;
$args['limit']   = 10;
$mt = $ctx->mt;
$obj = $mt->db()->fetch_foos($args);

以䞋、䞻な関数です。

クラス 関数
MT::Website fetch_website( $website_id )
MT::Website耇数 fetch_websites( $args )
MT::Blog fetch_blog( $blog_id )
MT::Blog耇数 fetch_blogs( $args )
MT::Template耇数 fetch_templates( $args )
MT::Page fetch_page( $page_id )
MT::Page耇数 fetch_pages( $args )
MT::Entry fetch_entry( $entry_id )
MT::Entry耇数 fetch_entries( $args, &$total_count )
MT::Category fetch_category( $cat_id )
MT::Category耇数 fetch_categories( $args )
MT::Folder fetch_folder( $folder_id )
MT::Folder耇数 fetch_folders( $args )
MT::Author fetch_author( $author_id )
MT::Author耇数 fetch_authors( $args )
MT::Comment fetch_comment( $comment_id )
MT::Comment耇数 fetch_comments( $args )

たずめ

今回の解説で、MTのプログラミングではSQL文を曞かずにオブゞェクトがデヌタベヌスに出し入れされる事ず、オブゞェクトの利甚が平易である事がわかっおいただけたず思いたす。

この解説や Movable Type オブゞェクト・リファレンス日本語 、 Movable Type Perl Documentation英語 を参考にプラグむン開発を楜しんで䞋さい。

プラグむン開発ガむド むンデックス

  1. プラグむン開発のためのファヌストステップ
  2. レゞストリ、YAMLに぀いお
  3. 環境倉数に぀いお
  4. プラグむンのロヌカラむれヌションに぀いお
  5. テストドリブンでのプラグむンの開発に぀いお
  6. グロヌバル・モディファむアプラグむンの開発に぀いお
  7. ファンクションタグ プラグむンの開発に぀いお
  8. ブロックタグ プラグむンの開発に぀いお
  9. コンディショナルタグ プラグむンの開発に぀いお
  10. プラグむンのデバッグ
  11. プラグむンの蚭定方法
  12. コヌルバックずフックポむント
  13. スケゞュヌルタスクの開発
  14. MTオブゞェクトの利甚方法
  15. 独自オブゞェクトの䜜成
  16. 新芏アプリケヌションの䜜成
  17. Transformerプラグむンの開発
  18. 管理画面のメニュヌ修正
  19. リストアクションの远加
  20. 動䜜モヌドの远加ずモヌダルりィンドりの衚瀺
  21. 倖郚Web APIずの連携
  22. 暩限ずロヌル
⚠ **GitHub.com Fallback** ⚠