MT NEWSとlerning MT

| | トラックバック(2)

そういえば、ダッシュボードに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

encode_text($text, $from, $to)

指定した文字列を、あるエンコードから別のエンコードに変換します。

ということらしい。

MT::I18N::encode_text( $news_object->data(), 'utf-8', undef )

引数が 'utf-8', undef となっているのはどういうことなんだろうか?

それからMT::Sanitizeが便利そう。

Movable Type オブジェクト・リファレンス - MT::Sanitize


comments powered by Disqus

トラックバック(2)

このブログ記事を参照しているブログ一覧: MT NEWSとlerning MT

このブログ記事に対するトラックバックURL: http://nozawashinichi.sakura.ne.jp/MT-4.25/mt-tb.cgi/580

やった!やったよ!直ったよ! というわけで、経緯は前エントリを見ていただいて、 ... 続きを読む

やった!やったよ!直ったよ! というわけで、経緯は前エントリを見ていただいて、 ... 続きを読む

comments powered by Disqus

このブログ記事について

このページは、Shinichi Nozawaが2009年8月19日 22:13に書いたブログ記事です。

ひとつ前のブログ記事は「XML::SimpleとかUTF8とかまじわからん」です。

次のブログ記事は「文字化け直りました: HatenaBookmarkWidget」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。