MT::Assetからファイル名を条件に画像を読み出すとおかしな現象が・・・
※perlソース部分の表示がおかしかったので修正しました(2008/12/12 09:40)
mt_assetテーブルにファイルアップローダーからアップして登録した下記のようなデータが入ってるとして、
mysql> select asset_id, asset_class, asset_file_name from mt_asset; +----------+-------------+------------------+ | asset_id | asset_class | asset_file_name | +----------+-------------+------------------+ | 1 | image | Water lilies.jpg | +----------+-------------+------------------+
シンプルなこんなソースでファイル名で読み出す。
use MT::Asset; my $image = MT::Asset->load({ file_name => "Water lilies.jpg" }); use Data::Dumper; return Dumper($image);
結果。
$VAR1 = undef;
取れない・・・
コマンドプロンプトよりSQL文を直に発行してasset_classを「file」に変更。
update mt_asset set asset_class = 'file' where asset_id = 1;
+----------+-------------+------------------+ | asset_id | asset_class | asset_file_name | +----------+-------------+------------------+ | 1 | file | Water lilies.jpg | +----------+-------------+------------------+
んでもう一度。
use MT::Asset; my $image = MT::Asset->load({ file_name => "Water lilies.jpg" }); use Data::Dumper; return Dumper($image);
結果。
$VAR1 = bless( { '__triggers' => {}, 'column_values' => { 'file_ext' => 'jpg', 'file_path' => '%r\\images\\Water lilies.jpg', 'parent' => undef, 'description' => undef, 'mime_type' => 'image/jpeg', 'file_name' => 'Water lilies.jpg', 'modified_on' => '20081211001119', 'created_on' => '20081211001119', 'modified_by' => undef, 'url' => '%r/images/Water%20lilies.jpg', 'blog_id' => '1', 'id' => '1', 'label' => 'Water lilies.jpg', 'class' => 'file', 'created_by' => '1' }, '__meta' => bless( { '__pkeys' => { 'asset_id' => '1' }, 'pkg' => 'MT::Asset' }, 'MT::Meta::Proxy' ), '__is_stored' => 1 }, 'MT::Asset' );
取れたよ!!!
ちなみに「id」を条件にすると・・・
use MT::Asset; my $image = MT::Asset->load({ id => 1 }); use Data::Dumper; return Dumper($image);
結果。
$VAR1 = bless( { '__triggers' => {}, 'column_values' => { 'file_ext' => 'jpg', 'file_path' => '%r\\images\\Water lilies.jpg', 'parent' => undef, 'description' => undef, 'mime_type' => 'image/jpeg', 'file_name' => 'Water lilies.jpg', 'modified_on' => '20081211001119', 'created_on' => '20081211001119', 'modified_by' => undef, 'url' => '%r/images/Water%20lilies.jpg', 'blog_id' => '1', 'id' => '1', 'label' => 'Water lilies.jpg', 'class' => 'file', 'created_by' => '1' }, '__meta' => bless( { '__pkeys' => { 'asset_id' => '1' }, 'pkg' => 'MT::Asset' }, 'MT::Meta::Proxy' ), '__is_stored' => 1 }, 'MT::Asset' );
取れたよ!!!
結論
なんでか知らんが、ファイル名などstringの値を条件に「load」する時は、asset_classの値が「file」じゃないとうまく取得できない><
なんでだぁぁぁ!!
追記
コメントで教えていただきました。
use MT::Asset; my $image = MT::Asset::Image->load({ file_name => "Water lilies.jpg" });
use MT::Asset; my $image = MT::Asset->load({ file_name => "Water lilies.jpg", class => 'image' });
上記の方法で取得できました!
さらに追記
コメントより。
my $filename = "Water lilies.jpg"; my $asset_pkg = MT::Asset->handler_for_file( $filename ); my $data = $asset_pkg->load({ file_name => $filename });
2行目で指定したファイル名のデータの「MT::Asset::*」のPackageを取得し、3行目でそれを使ってload。
これならどんなファイルタイプでも取得できます!