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 テーブルのデータを利用しますので、管理画面から再構築を行う必要があります。
- カテゴリー
- サポート
- トラブルシューティング
- 技術情報
コメントを投稿する