Movable Type は OR マッパーとして Data::ObjectDriver を使っているので、このモジュールができることはたいがいできます。Movable Type ではあまり使われていないようですが、load 条件としてカラム名に対して配列のリファレンスを渡すだけで、例えば記事タイトルが
エントリーのみを load する、なんていうことが簡単にできます。具体的には、以下のようなコードを書くだけです。
my @conditions = ( 'Movable Type', 'Plugins', 'Template' );
my @entries = MT->model( 'entry' )->load( { title => \@conditions, } );
条件指定をワイルドカードな Like 条件にすることもできます。
my @conditions = (
{ 'like' => '%Movable Type%' },
{ 'like' => '%Plugins%' },
{ 'like' => '%Template%' },
);
my @entries = MT->model( 'entry' )->load( { title => \@conditions, } );
この場合、タイトルが
等の場合は load されますが、
の時には load されません。このような load の仕方は知っておくと Movable Type の API に乗っかる CGI アプリケーションを作成する場合なんかにとても役に立ちます。
プラグインにするなら、以下のような形でしょうか。
package MT::Plugin::SampleEntries;
use strict;
use MT;
use MT::Plugin;
use base qw( MT::Plugin );
our $VERSION = 0.1;
@MT::Plugin::SampleEntries::ISA = qw( MT::Plugin );
my $plugin = new MT::Plugin::SampleEntries( {
name => 'SampleEntries',
id => 'SampleEntries',
key => 'sampleentries',
version => $VERSION,
} );
MT->add_plugin( $plugin );
sub init_registry {
my $plugin = shift;
$plugin->registry( {
tags => {
block => {
SampleEntries => \&_hdlr_sample_entries,
SampleEntriesHeader => \&_hdlr_pass_tokens,
SampleEntriesFooter => \&_hdlr_pass_tokens,
},
function => {
SampleEntriesCount => \&_hdlr_sample_entries,
},
},
} );
}
sub _hdlr_sample_entries {
my ( $ctx, $args, $cond ) = @_;
my $builder = $ctx->stash( 'builder' );
my $tokens = $ctx->stash( 'tokens' );
my @conditions = (
{ 'like' => '%Movable Type%' },
{ 'like' => '%Plugins%' },
{ 'like' => '%Template%' },
);
if ( lc $ctx->stash( 'tag' ) eq 'sampleentriescount' ) {
return MT->model( 'entry' )->count( { title => \@conditions, } );
}
my @entries = MT->model( 'entry' )->load( { title => \@conditions, } );
my $res = ''; my $i = 0;
my $vars = $ctx->{ __stash }{ vars } ||= {};
if ( @entries ) {
for my $entry ( @entries ) {
local $vars->{ __first__ } = ! $i;
local $vars->{ __last__ } = ! defined $entries[ $i + 1 ];
local $vars->{ __odd__ } = ( $i % 2 ) == 0; # 0-based $i
local $vars->{ __even__ } = ( $i % 2 ) == 1;
local $vars->{ __counter__ } = $i + 1;
local $ctx->{ __stash }{ entry } = $entry;
local $ctx->{ __stash }{ blog } = $entry->blog;
local $ctx->{ __stash }{ blog_id } = $entry->blog_id;
local $ctx->{ current_timestamp } = $entry->modified_on;
local $ctx->{ modification_timestamp } = $entry->modified_on;
my $out = $builder->build( $ctx, $tokens, { %$cond,
SampleEntriesHeader => ! $i,
SampleEntriesFooter =>
!defined $entries[ $i + 1 ],
} );
$res .= $out if $out;
$i++;
}
return $res || '';
} else {
return $ctx->_hdlr_pass_tokens_else( @_ );
}
}
sub _hdlr_pass_tokens {
my( $ctx, $args, $cond ) = @_;
my $b = $ctx->stash( 'builder' );
defined( my $out = $b->build( $ctx, $ctx->stash( 'tokens' ), $cond ) )
or return $ctx->error( $b->errstr );
return $out;
}
1;
Comments