MT4の「アイテム」を拡張する

  • 投稿日:
  • by
  • カテゴリ:

先日、Movable Type 4 Hack-a-thonに参加してきました。

ハッカソンとは、プログラマが一堂に会して、黙々と、ときには見せ合ったり質問しあったりしながら、自分のしたいことについて自分のしたいようにプログラムを書くというイベントです。

ということで、思いっきりHackを楽しんできました。その成果は、MovableType用EasyPodcasting Plugin Ver.0.60になります。

今回は、そのHackをする中で、MT4の「アイテム」の拡張の仕方が分かったので、簡単にまとめておこうと思います。

MT4ではファイルのアップロードおよび管理をするための機能として「アイテム」という概念があります。
これにより、ファイルをアップロードして、WYSIWYGのエディタに貼り付けると、画像ならイメージタグが、ファイルならリンクが追加されることになります。
今回は、この機能を拡張して、mp3ファイルがアップロードされると、Flash製のmp3プレーヤを表示できるようにしてみました。
アイテムは、MT::Assetをベースにした、

  • MT::Asset::Audio
  • MT::Asset::Image
  • MT::Asset::Video

これらのオブジェクトによって、メディアのタイプ別に管理されます。
今回は、MT::Asset::MP3を新たに追加します。
MT::Assetを継承したクラスを作り、そこに

__PACKAGE__->install_properties({
    class_type => 'mp3',
});

として、class_typeの追加を行った後、extensions、class_label、class_label_plural、as_htmlメソッドを追加しました。

sub extensions { [ qr/mp3/i ] }

として、mp3という拡張子を持つものをターゲットとすることを指定します。
class_label、class_label_pluralでは、

sub class_label {
    MT->translate('MP3');
}

sub class_label_plural {
    MT->translate('MP3');
}

このように、メディアの種類のテキストを返します(今回の場合translateは必要ないような気もしますが……)。

as_htmlでは、エディタに挿入するHTMLコードを指定します。

sub as_html {
    my $asset = shift;
    my ($param) = @_;

    my $url = $asset->url;
    my $blog = $asset->blog;
    my $title = $asset->label;
    my $path = MT->instance->static_path;
    $path .= '/' unless $path =~ m!/$!;
    $path .= 'plugins/EasyPodcasting/mp3player.swf';

    my $html = <<"EOT";
<div class="mp3">
<div class="mp3_player">
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="250" height="50" id="mp3player" align="middle">
    <param name="allowScriptAccess" value="sameDomain" />
    <param name="movie" value="$path?mp3url=$url" />
    <param name="quality" value="high" />
    <param name="bgcolor" value="#ffffff" />

    <embed src="$path?mp3url=$url" quality="high" bgcolor="#ffffff" width="250" height="50" name="mp3player" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</div>
<div class="mp3_link">
<a href="$url" class="link_mp3" title="$title">$title</a>
</div>
</div>
<!-- [mp3:$url:$title] -->
EOT

    return $asset->enclose($html);
}

このファイルをasset_mp3.plなどとしてpluginsディレクトリにおいて置けばオッケーです。

ただ、このようにWYSIWYGエディタにFlashのオブジェクトを貼り付けた場合、WEBブラウザによっては、表示されないことがあるようです(例えば、Windows版のFirefox)。これは、エディタ側の問題なのかな、と思います。