MT のエントリー確認画面を構築後の画面と同一にする方法
MovableType で以前から気になっていた仕様の1つとして、エントリー確認画面が構築後の画面と異なるという点です。いろいろなタグや CSS を使っていると、脳内変換が追いつかなくなってきて、実際に構築するまでイメージがわからないという事態に陥っています。
MT の確認画面の html を生成するメソッドを解析してみると、確認画面と構築後の画面が異なる理由は、以下の2点に起因するものでした。
- 自サイトで使っている CSS が読み込まれないため、見栄えが異なる。 テンプレートモジュールで定義されたタグが展開されていない状態でプレビューするため、見栄えが異なる。
/lib/MT/App/CMS.pm を編集する
sub preview_entry メソッドの下記の部分を見つけて、赤色の行のように、自サイトの CSS を読み込む指定を追加して下さい。my $preview_code = <<'HTML';たったこれだけで、サイトの見栄えが構築後とほぼ同じようになっていると思います。 (追記)その他、Individual Entry Archive 中に記載している <div> タグも MTEntryBody や MTEntryMore の前後に追記してやる必要があります。
<link rel="stylesheet" href="/MT/blog.css" type="text/css">
<p><b><$MTEntryTitle$></b></p>
<$MTEntryBody$>
<$MTEntryMore$>
HTML
これで前者の CSS の不具合は解消されます。だし、MT の元々の styles.css と競合する部分で MT 管理画面の見栄えが崩れるという弊害はあります。スタイルの指定が競合しないように確認画面専用の CSS を作ればこの点も解消できますが、僕は面倒なので MT の管理画面が多少崩れても気にしていません。
さて、僕の場合は MTmacro を使ったテンプレートモジュールを利用しているので、もう一工夫してあげる必要があります。具体的には下記のようにします。
$ctx->stash('blog_id', $blog_id);これで、テンプレートモジュールも確認画面で有効になります。
my $preview_code = <<'HTML';
<link rel="stylesheet" href="/MT/blog.css" type="text/css">
<$MTInclude module="MTMacro"$>
<p><b><$MTEntryTitle$></b></p>
<$MTEntryBody process_tags="1" apply_macros="1"$>
<$MTEntryMore process_tags="1" apply_macros="1"$>
HTML
このカラクリをちょっと説明すると、/lib/MT/Template/Context.pm 内の sub post_process_handler メソッドにおいて、
sub post_process_handler {
sub {
my($ctx, $args, $str) = @_;
if ($args) {
my %local_args = %$args;
for my $arg (keys %local_args) {
if (my $code = $MT::Template::Context::Global_filters{$arg}) {
$str = $code->($str, $args->{$arg}, $ctx);
delete $local_args{$arg};
}
}
で Global_filters を実行するコードがありますが、確認画面ではこのコードが実行されていないようです(実行されている Global_filters があるかのまでは未解析です)。その理由はさらに他のコードを解析するとわかりますが、確認画面からこのコードが実行されるときに、blog_id が未定義状態なのが原因です。したがって、$ctx->stash('blog_id', $blog_id); をコードに追加しているわけです。
荒技ですが、preview_entry メソッドを書き換えるって方法でほぼ確実に構築後と同じイメージを確認画面で閲覧可能になりました。最近は、HomePage ビルダーとかにもブログ作成の連係機能が付いていたりしますが、この hack だけでも随分とエントリー作成の助けになるのではないかなぁ〜と思っています。
コメントやシェアをお願いします!