Movable Typeでオブジェクトデータをそのまま取得する
Movable Typeで、デーtベースに定義されているテーブルのフィールド(オブジェクトデータ)をそのまま取得する方法です。
Movable Typeのブログ記事やブログなど、各オブジェクトのデータをPerlで取得するには、次のように記述します。下はブログ記事ID「1」のブログ記事タイトルを取得する例です。
use MT::Entry;
my $entry_id = '1';
my $entry = MT::Entry->load( $entry_id );
my $title = $entry->title;
ところで、Movable Type 5における、ブログのサイトURLやサイトパスは、ウェブサイトのサイトURLとサイトパスと結合するため、データベースには「/::/+サブディレクトリ」という形式で保存されています。
以下は、phpMyAdminで参照したmt_blogのサイトURL(blog_site_url)です。一番上がウェブサイトURLで、その下の2つは、ウェブサイトに属するブログのブログURLです。真ん中のブログのブログURLは「http://user-domain/1/」、一番下のブログのブログURLは「http://user-domain/2/」となります。
サブドメインの場合は「サブドメイン+/::/」となります。
このブログURLのデータを、「/::/」が付与されたまま取得したい場合、
use MT::Blog;
my $blog_id = '2';
my $blog = MT::Blog->load( $blog_id );
my $site_url = $blog->site_url;
と記述しても取得することができず、通常のURLとなります。
これは、ブログのサイトパスを取得する際に使う、MT::Blog::site_url内で親ウェブサイトのパスと結合する処理になっているためです(下)。
sub site_url {
my $blog = shift;
if (@_) {
return $blog->SUPER::site_url(@_);
} elsif ( $blog->is_dynamic ) {
my $cfg = MT->config;
my $path = $cfg->CGIPath;
if ($path =~ m!^/!) {
# relative path, prepend blog domain
my ($blog_domain) = $blog->archive_url =~ m|(.+://[^/]+)|;
$path = $blog_domain . $path;
}
$path .= '/' unless $path =~ m{/$};
return $path;
} else {
my $url = '';
if ($blog->is_blog()) {
if (my $website = $blog->website()) {
$url = $website->SUPER::site_url;
}
else {
# FIXME: there are a few occasions where
# a blog does not have its parent, like (bugid:102749)
return $blog->SUPER::site_url;
}
my @paths = $blog->raw_site_url;
if ( 2 == @paths ) {
if ( $paths[0] ) {
$url =~ s!^(https?)://(.+)/$!$1://$paths[0]$2/!;
}
if ( $paths[1] ) {
$url = MT::Util::caturl( $url, $paths[1] );
}
}
else {
$url = MT::Util::caturl( $url, $paths[0] );
}
}
else {
$url = $blog->SUPER::site_url;
}
return $url;
}
}
前置きが長くなりましたが、データベース上のデータをそのまま取得するには、Data::ObjectDriver::BaseObject::columnを利用し、columnのパラメータに、取得したいフィールドのフィールド名を指定します。
use MT::Blog;
my $blog_id = '2';
my $blog = MT::Blog->load( $blog_id );
my $site_url = $blog->column('site_url');
Data::ObjectDriver::BaseObjectは、MT::Objectが継承しているので、ソースコード内で意識する必要はありません。
- Movable Typeオブジェクトのcache_propertyについて
おはようございます。
とても、ベンキョーになります。
>Data::ObjectDriver::BaseObjectは、MT::Objectが継承しているので、
この部分、もしかしたら「MT::Object」を「MT::Blog」が継承しているという点をおっしゃってるのでしょうか。
なるほどで~す。
>oscarさん
こんばんは。
コメントありがとうございます。
継承の件、YESです!