2016年10月04日
WindowsからLinuxへ環境移行した際に管理画面でアイテムが正しく表示されない
原因は、mt_asset テーブルの asset_file_path の値指定方法にあります。 Movable Type / PowerCMS のデータベースにおいて「アイテム」は mt_assetテーブルに格納されています。ファイルのパスが格納されているカラムは「asset_file_path」ですが、値を覗いてみると以下のような様式で値が格納されています。
%r/banner/main_visual.jpg
先頭の「%r」記法について
| 記法 | 意味 | コード |
|---|---|---|
| %r | ウェブサイト・ブログのサイト・パス | $blog->site_path |
| %a | ウェブサイト・ブログのアーカイブ・パス | $blog->archive_path |
| %s | サポートディレクトリのパス | MT->instance->support_directory_path |
Perlでオブジェクトを扱う時の file_path の値
require MT::Asset;
my $asset = MT::Asset->load( $asset_id );
print $asset->file_path;
# 変換後の値が出力される
# /var/www/html/blog/banner/main_visual.jpg
変換前の %r/banner/main_visual.jpg をそのまま取得したい時
require MT::Asset;
my $asset = MT::Asset->load( $asset_id );
print $asset->column_values->{ file_path };
# データベースの値がそのまま出力される
# %r/banner/main_visual.jpg
ファイルのパスからオブジェクトをロードする
my $file_path = '/var/www/html/blog/banner/main_visual.jpg';
my $site_path = $blog->site_path;
$site_path =~ s!/$!!;
$file_path =~ s!^$site_path!%r!;
require MT::Asset;
my $asset = MT::Asset->load( { file_path => $file_path,
blog_id => $blog_id,
class => '*' } );
# class => '*' は画像、ビデオ、アイテム、オーディオの区別なくロードするためのおまじない
WindowsからLinuxへ環境移行した際に管理画面でアイテムが正しく表示されない時
バックスラッシュ「\」をスラッシュ「/」に変更する必要があります。バッチとして作成し、実行すると良いでしょう(MTのtoolsディレクトリ配下に設置するバッチのテンプレートはこちら)。
require MT::Asset;
my $iter = MT::Asset->load_iter( { class => '*' } );
while ( my $asset = $iter->()) {
my $file_path = $asset->column_values->{ file_path };
$file_path =~ s!\\!/!g;
print "$file_path\n";
$asset->file_path( $file_path );
$asset->save or die $asset->errstr;
}
※PowerCMSの場合、リビジョンバックアップのアイテム XML の中身も置換する必要があります。
同じように(異なるOSプラットフォーム間でに移行時に)調整が必要なのはウェブサイトやブログの公開パス(mt_blogテーブルの blog_site_pathカラムの値)ですが、見落としがちなのは mt_fileinfo テーブルの fileinfo_file_pathです(このテーブルのデータはダイナミック・パブリッシング、DynamicMTMLやキュー経由の再構築で利用されます)。
このテーブルのデータは管理画面からの再構築で再度生成されますのでSQL等でデータを空にしてから、再構築を行えば正しい値に変換されます。
TRUNCATE TABLE mt_fileinfo;
※rebuild-archives スクリプトは mt_fileinfo テーブルのデータを利用しますので、管理画面から再構築を行う必要があります。
- カテゴリー
- サポート
- トラブルシューティング
- 技術情報



コメントを投稿する