コンテキストに blog_id もセットしないとカスタムフィールドの出力でコンテキストエラーが出る場合がある

Movable Type で記事を扱う独自のブロックタグ(プラグイン)を作っているときに、場合によってカスタムフィールド画像がうまく取れないという現象に遭遇しました。

例えば、ウェブサイトとブログ、カスタムフィールド(タイプ「画像」、ベースネーム「EntryThumbnail」)が以下のような状態であるとします。

Website A (ID:1) : EntryThumbnailなし
├── Blog A-1 (ID:2) : EntryThumbnailあり
├── Blog A-2 (ID:3) : EntryThumbnailあり
├── Blog A-2 (ID:4) : EntryThumbnailあり
└── Blog A-3 (ID:5) : EntryThumbnailなし

このような関係にあるとき、Website A のインデックステンプレートで下記のようなテンプレートを出力しようとしたとき、

<mt:Entries include_blogs="1,2,3,4">
<mt:EntryThumbnailAsset><img src="<mt:AssetURL>" alt=""></mt:EntryThumbnailAsset>
</mt:Entries>

EntryThumbnailAsset に関するコンテキストエラーが出ました。

プラグインのコードを見て、ちゃんとブログの情報をコンテキストにセットしているのになんでだろう、と思っていたのですが、

my @entries = MT->model('entry')->load($term, $arg);
foreach my $entry (@entries) {
    local $ctx->{__stash}{entry} = $entry;
    local $ctx->{__stash}{blog} = $entry->blog;
    local $ctx->{current_timestamp} = $entry->authored_on;
    local $ctx->{modification_timestamp} = $entry->modified_on;
    my $tokens = $ctx->stash('tokens');
    my $builder = $ctx->stash('builder');
    defined(my $value = $builder->build($ctx, $tokens, $cond))
        or return $ctx->error($builder->errstr);
}

どうやら下記のようにして、blog_id もコンテキストにセットしないとダメなようでした。

my @entries = MT->model('entry')->load($term, $arg);
foreach my $entry (@entries) {
    local $ctx->{__stash}{entry} = $entry;
    local $ctx->{__stash}{blog} = $entry->blog;
    local $ctx->{__stash}{blog_id} = $entry->blog_id;
    local $ctx->{current_timestamp} = $entry->authored_on;
    local $ctx->{modification_timestamp} = $entry->modified_on;
    -- 省略 --
}

以上、備忘録として。

  • このエントリーをはてなブックマークに追加
Just a second...