Movable Typeでオブジェクトデータをそのまま取得する

Movable Typeでオブジェクトデータをそのまま取得する

Posted at September 17,2010 3:30 AM
Tag:[MovableType, Object]

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/」となります。

mt_blog

サブドメインの場合は「サブドメイン+/::/」となります。

mt_blog

このブログ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が継承しているので、ソースコード内で意識する必要はありません。

関連記事
トラックバックURL


コメント

おはようございます。
とても、ベンキョーになります。
>Data::ObjectDriver::BaseObjectは、MT::Objectが継承しているので、
この部分、もしかしたら「MT::Object」を「MT::Blog」が継承しているという点をおっしゃってるのでしょうか。
なるほどで~す。

[1] Posted by oscar logo : September 17, 2010 7:03 AM

>oscarさん
こんばんは。
コメントありがとうございます。
継承の件、YESです!

[2] Posted by yujiro logo : September 18, 2010 3:05 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)