Under the Bridge

a Picture of the Late Him

MT4.1:エントリの既存DBへアクセスしてデータ取得

2008年5月10日 11:28 | Writer: yoshi | 記事本文 | コメント(0) | トラックバック(0)

MTプラグイン系。

エントリの既存DBへアクセスしてデータ取得を行うためのメモ。

サンプルコード自体は役には立たないが、内部の構造を調べる上では少しは参考になるかも。

サンプル

package MT::Plugin::EntryFieldCheck;
use MT::Plugin;
use base qw(MT::Plugin);
our $VERSION = '0.1';


my $plugin = new MT::Plugin::EntryFieldCheck({
    id => 'EntryFieldCheck',
    key => 'entry_field_check',
    name => 'EntryFieldCheck',
    version => $VERSION,
    description => '<MT_TRANS phrase=\'The Sample Entry Field Check \'>',
    author_name => 'apstar',
    author_link => 'http://www.mtde.info/',
});
MT->add_plugin($plugin);

sub init_registry
{
    my $plugin = shift;
    $plugin->registry({
        tags => {
            function => {
                'GetData' => sub{&_hdlr_get_field;},
            },
        },
    });
    
}

sub _hdlr_get_field {
    my $arg = $_[1];
    my $data = $_[0]->stash('entry') or return $_[0]->_no_entry_error($_[0]->stash('tag'));
    
    my $basename = $data->basename;
    my $title = $data->title;
    my $text = $data->text;

    return $basename .'<br />' .$title .'<br />' .$text;
}

1;

このコードの機能

そのエントリ自身のベースネームとタイトルと本文を取り出す。

メモ

上記コード自体は、\lib\MT\Template\ContextHandlers.pm内の、sub _hdlr_entry_body に記述されているもの。

ここ

my $data = $_[0]->stash('entry') or return $_[0]->_no_entry_error($_[0]->stash('tag'));

orの前は、$dataという変数でエントリの参照。

orの後は、エラー時の処理で、ContextHandlers.pm内のsub _no_entry_errorが呼び出される。この関数内の英語コメントには、「MTEntriesタグをコンテキスト外で使用してない?」的な記述がある。以下、sub_no_entry_erro関数のコード。まあ、どうでもいい。

sub _no_entry_error {
    my $tag = $_[1];
    $tag = 'MT' . $tag unless $tag =~ m/^MT/i;
    return $_[0]->error(MT->translate(
        "You used an '[_1]' tag outside of the context of an entry; " .
        "perhaps you mistakenly placed it outside of an 'MTEntries' container?",
        $tag));
}

ところで、このコードの sub _hdlr_get_field 関数は、以下のように書くことが出来る。こちらのほうが見やすい。


sub _hdlr_get_field {
    my ($ctx, $args) = @_;
    my $data = $ctx->stash('entry');
    
    my $basename = $data->basename;
    my $title = $data->title;
    my $text = $data->text;
    
    return $basename .'<br />' .$title .'<br />' .$text;
}

basenameとかtitleとかtextというのは、MTEntryBasenameやMTEntryTitleやMTEntryBodyで取得できるそれと等しい。これは「DBからのデータ取得」ということをファンクションタグでやっているわけで、その「MTタグ」と「処理を行う関数」の詳しい対比表(表ではないが)は、MT4.1jaの場合、ContextHandlers.pm内の307~345行目辺りを見るといいと思う。

ちなみにこのサンプルで扱ったbasenameやtitleやtextは、ずばりmt_entryテーブル内のフィールド名である。頭に"entry_"が付与されている。こちらの環境はXAMPPでMySQLを用いている。phpMyAdminでのスクリーンショットを以下に貼っておこう。

20080510.png

トラックバック(0)

このブログ記事を参照しているブログ一覧: MT4.1:エントリの既存DBへアクセスしてデータ取得

このブログ記事に対するトラックバックURL:

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)