そういえば、ダッシュボードにMTニュースとlerning MTが表示される
ウィジェットがあったのを思い出し、
あれって、LWPに情報をフェッチさせて、
それをダッシュボードに表示させるものだから、
いま抱えてる謎について参考になるかもしれないと思って、
ソースコードをのぞいてみる。
lib/MT/CMS/Dashboard.pmの150行目
sub mt_news_widget {
my $app = shift;
my ( $tmpl, $param ) = @_;
$param->{news_html} = get_newsbox_content($app) || '';
$param->{learning_mt_news_html} = get_lmt_content($app) || '';
}
sub get_newsbox_content {
my $app = shift;
my $newsbox_url = $app->config('NewsboxURL');
if ( $newsbox_url && $newsbox_url ne 'disable' ) {
return MT::Util::get_newsbox_html($newsbox_url, 'NW');
}
return q();
}
そしてMT::Util::get_newsbox_htmlは
sub get_newsbox_html {
my ($newsbox_url, $kind, $cached_only) = @_;
return unless $newsbox_url;
return unless is_url($newsbox_url);
return unless $kind && (length($kind) == 2);
$cached_only ||= 0;
my $NEWSCACHE_TIMEOUT = 60 * 60 * 24;
my $sess_class = MT->model('session');
my ($news_object) = ("");
my $retries = 0;
$news_object = $sess_class->load( { id => $kind } );
my $refresh_news;
if ( $news_object
&& ( $news_object->start() < ( time - $NEWSCACHE_TIMEOUT ) ) )
{
$refresh_news = 1;
}
my $last_available_news = MT::I18N::encode_text( $news_object->data(), 'utf-8', undef )
if $news_object;
return $last_available_news unless $refresh_news || !$news_object;
return q() if $cached_only;
# don't block the dashboard for more than 10 seconds to fetch
# the news feed...
my $ua = MT->new_ua( { timeout => 10 } );
return $last_available_news unless $ua;
my $req = new HTTP::Request( GET => $newsbox_url );
my $resp = $ua->request($req);
my $result = $resp->content();
if ( !$resp->is_success() || !$result ) {
# failure; either timeout or worse
# if news_object is available, bump up it's expiration
# so we don't attempt to hit the server again
# for an hour
if (! $news_object ) {
$news_object = MT::Session->new;
$news_object->set_values(
{
id => $kind,
kind => $kind,
data => ''
}
);
$last_available_news = '';
$refresh_news = 1;
}
if (defined($last_available_news) && $refresh_news) {
$news_object->start( ( time - $NEWSCACHE_TIMEOUT ) + 60 * 60 );
$news_object->save;
}
return $last_available_news;
}
require MT::Sanitize;
# allowed html
my $spec = 'a href,* style class id,ul,li,div,span,br';
$result = MT::Sanitize->sanitize( $result, $spec );
$news_object = MT::Session->new();
$news_object->set_values(
{
id => $kind,
kind => $kind,
start => time(),
data => $result
}
);
$news_object->save();
$result = MT::I18N::encode_text( $result, 'utf-8', undef );
return $result;
}
get_newsbox_htmlサブルーチンの前半は、すでに取得してある
ニュースの情報が古いかどうかチェックし、
まだ新しければ、そこでreturn、
古くなっていればユーザーエージェントに取りに行かせるという感じ。
気になるのはMT::I18N::encode_textというメソッドで、
以下にリファレンスがある。
Movable Type オブジェクト・リファレンス - MT::I18N
指定した文字列を、あるエンコードから別のエンコードに変換します。
ということらしい。
MT::I18N::encode_text( $news_object->data(), 'utf-8', undef )
引数が 'utf-8', undef となっているのはどういうことなんだろうか?
それからMT::Sanitizeが便利そう。
Movable Type オブジェクト・リファレンス - MT::Sanitize