Movable Type 備忘録

 ダイナミック・パブリッシングにハマりました

こんばんわ^^

友人がダイナミック・パブリッシングにしたいとのことで以前から TRY してたようなのですが、どうしてもうまくいかず、今日わたしがリベンジしに行ってきました。

でも、何度やっても以下のようなエラーが出てしまって正しく動作しませんでした。

Fatal error: Smarty error: [in evaluated template line 134]: syntax error: unrecognized tag 'mtjavascriptframework' (Smarty_Compiler.class.php, line 580) in /home/●●●/www/mt/php/extlib/smarty/libs/Smarty.class.php on line 1095

上記エラーを見る限り、Perl 版ダイナミック・パブリッシングとして動作せず、ネイティブなダイナミック・パブリッシングが動作してるように見受けられました。 というのも、MTJavaScriptFramework というプラグインを作成してあげてたのですが、そのプラグインが使えない・・・と言われてます。
そのプラグインを外しても今度は他のプラグインで同様にエラーしてしまっていたので、明らかに Perl 版ダイナミック・パブリッシングで動作してないようでした。

経緯

友人の環境はさくらインターネットで PHP は Ver 5.2.6 を使用しており、Movable Type は先日リリースされた MT4.23 をインストールしてあげました。

今回始めてのダイナミック・パブリッシングということで、わたしのサイトでも利用させてもらっている The blog of H.Fujimoto さんとこの PerlDynamic プラグインを使わせてもらいました。

原因

正直なところ原因が分かりません。
PerlDynamic プラグインの初期化時に作成される 3 つのファイルと 2 つのフォルダが存在してるとエラーするのかと思いきや、そうでもなかったりなので原因の特定ができませんでした。

[2009.02.08] 原因分かったよ。
プラグインの初期化の際に「.htaccessファイルの書き換えに失敗しました。」というエラーがでる原因は、ルート(ブログのトップページがある場所)に .htaccess が既に存在してる場合エラーすることが分かりました。

対策

たとえば、わたしのサイトではブログのサイトパス( http://bizcaz.com/ )とアーカイブパス( http://bizcaz.com/archives )が異なります。 ダイナミック・パブリッシングは基本的にアーカイブだけなので、アーカイブパス( http://bizcaz.com/archives/ )配下の .htaccess さえ正しければよいと思ってました。
でも、実際 PerlDynamic プラグインが初期化する .htaccess はどうもサイトパス( http://bizcaz.com/ )配下にある .htaccess を初期化しにいってるようです。
試しに以下の手順で初期化を行ったところ一発 OK でした。

  1. PerlDynamic プラグインをインストールする。
  2. ダイナミック・パブリッシングしたいテンプレートの保存/再構築を行う。
  3. 再構築が完了したら以下に示した .htaccess の修正を行う。
    基本は必ずサイトパス( トップページがある場所 )上の mt-dynamic.php を指定することです。 たとえば、ドメインが http://bizcaz.com/ で、ブログのサイトパスが http://bizcaz.com/blog/ だった場合、以下の .htaccess 修正例の赤字で記したパスは以下のようになります。

    1. /blog/mt-dynamic.php

    ドメイン( http://bizcaz.com/ )とブログのサイトパスが同じ場合には以下のようになります。

    1. /mt-dynamic.php

    修正したら保存します。

  4. サイトパス( http://bizcaz.com/ )配下の .htaccess を一時的にバックアップする。
  5. アーカイブパス( http://bizcaz.com/archives/ )配下の .htaccess をサイトパス( http://bizcaz.com/ )配下にコピーする。
  6. PerlDynamic プラグインを初期化する。
  7. 初期化が完了したら、サイトパス( http://bizcaz.com/ )配下の、バックアップした .htaccess を元に戻します。
    ※PerlDynamic プラグインの初期化さえ完了すれば問題ない!? みたいです。

以上でエラーすることなく初期化することができました。
以下に .htaccess の修正箇所を赤字で記します。

ダイナミック・パブリッシング用 .htaccess の記述

  1. # %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
  2. # Disable fancy indexes, so mtview.php gets a chance...
  3. #Options -Indexes +SymLinksIfOwnerMatch
  4.   <IfModule mod_rewrite.c>
  5.   # The mod_rewrite solution is the preferred way to invoke
  6.   # dynamic pages, because of its flexibility.
  7.  
  8.   # Add mtview.php to the list of DirectoryIndex options, listing it last,
  9.   # so it is invoked only if the common choices aren't present...
  10.   <IfModule mod_dir.c>
  11.     DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /mt-dynamic.php
  12.   </IfModule>
  13.  
  14.   RewriteEngine on
  15.  
  16.   # don't serve mtview.php if the request is for a real directory
  17.   # (allows the DirectoryIndex lookup to function)
  18.   RewriteCond %{REQUEST_FILENAME} !-d
  19.  
  20.   # don't serve mtview.php if the request is for a real file
  21.   # (allows the actual file to be served)
  22.   RewriteCond %{REQUEST_FILENAME} !-f
  23.   RewriteCond %{REQUEST_FILENAME} !\.(cgi|css|gif|jp*g|png)$
  24.   # anything else is handed to mtview.php for resolution
  25.   # passthrough query parameters
  26.   RewriteRule ^(.*)(\?.*)?$ /mt-dynamic.php$2 [L,QSA]
  27. </IfModule>
  28.  
  29. <IfModule !mod_rewrite.c>
  30.   # if mod_rewrite is unavailable, we forward any missing page
  31.   # or unresolved directory index requests to mtview
  32.   # if mtview.php can resolve the request, it returns a 200
  33.   # result code which prevents any 4xx error code from going
  34.   # to the server's access logs. However, an error will be
  35.   # reported in the error log file. If this is your only choice,
  36.   # and you want to suppress these messages, adding a "LogLevel crit"
  37.   # directive within your VirtualHost or root configuration for
  38.   # Apache will turn them off.
  39.   ErrorDocument 404 /mt-dynamic.php
  40.   ErrorDocument 403 /mt-dynamic.php
  41. </IfModule>
  42. ## ******* Movable Type generated this part; don't remove this line! *******

注意すること

わたしのサイトでは幸いブログの PHP 化を行ってるので特に問題にはならなかったのですが、ブログの PHP 化を行ってない場合にはダイナミック・パブリッシングを適用するテンプレートのみ XML 宣言を以下のように修正する必要があるみたい。

XML 宣言

  1. <?php echo '<?xml version="1.0" encoding="<$MTPublishCharset$>"?>'."\n" ?>

要するに、ダイナミック・パブリッシングは PHP で生成したコードが表示されるので、上記のような修正が必要になります。
たとえば、カテゴリと月別アーカイブだけダイナミック・パブリッシングにする場合、テンプレート内で以下のような条件式で XML 宣言を切り替えるといいと思います。

XML 宣言切り替え

  1. <mt:If name="archive_class" like="category_archive|datebased-monthly-archive">
  2.     <?php echo '<?xml version="1.0" encoding="<$MTPublishCharset$>"?>'."\n" ?>
  3. <mt:Else>
  4.     <?xml version="1.0" encoding="<$MTPublishCharset$>"?>
  5. </mt:If>

以下のページで、各アーカイブで設定されてる予約変数を調べることができます。

 Trackback Pings(0)

No trackbacks found.

 Comments(6)

#1: Posted by ゆにっく @ December 7, 2008 [REPLY]
user-pic

「ハマりました」って言うからすごく面白くてやめられない系の話かと勝手に勘違いしてました。タイトルの通りだったんですねorz

>ネイティブなダイナミック・パブリッシング
これってうちで実装してるやつかなー???WingMemoさんのところに書いてあったやつなのですが。なんせ1,000件近く記事がありますから、もう静的生成ではブログを維持できません…。


#2: Posted by Author Profile Page bzbellからゆにっくへの返信 @ December 7, 2008 [REPLY]
user-pic

>>1 ゆにっく さん

ちわやあ!

> これってうちで実装してるやつかなー???WingMemoさんのところに書いてあったやつなのですが。

そうなるかな。
工夫しない限り、普通に再構築するとプラグインが使えなくなりますもんね。そんな状態でした。
今まで通り( テンプレートの構成を維持しつつ )普通にプラグインを使って再構築したかったのですがそれができなかった・・・という例ですねしくしく
原因が分からなかったのでスッキリしない記事でごめんなさいあせあせ

#3: Posted by oscar @ December 8, 2008 [REPLY]
user-pic

あれっ?TypeKey(Typepad Connect)のサインイン効いてない様な・・・
で、ダイナミックパブリッシングと呼ばれて、飛んできましたよ。
と言いつつ、最近はあまり使ってないですが。

.htaccess内の指定は、ファイルの置かれている場所が起点になるので、通常は
./mt-dynamic.php
で良い筈ですよ。
それで、ちょっと気になっているのは、mt-dynamic.php$2 と指定している部分。
クエリーから先を渡そうとしているみたいだけど、[L,QSA]なので2度渡ししている様に思えます。
通常はファイル名をそっくり私だけのハズですけど。
RewriteRule ^(.*)$ ./mt-dynamic.php [L,QSA]

#4: Posted by Author Profile Page bzbellからoscarへの返信 @ December 8, 2008 [REPLY]
user-pic

>>3 oscar さん

こんばんわ^^

> あれっ?TypeKey(Typepad Connect)のサインイン効いてない様な・・・

やっぱり!?
たまにサインインしたのにサインインされないことがあるんですよねぇ。
他のサイトさんはどうかな・・・と試したのですがやっぱり同じだったので、認証元の TypePad Connect が原因かな・・・なんて思ってたりしてあせあせ

実は oscar さんに相談しようかと思ってたのですが、昼間だし、休日だしってことでコメントは控えたんです。さすがに配布元の壱さんところには相談しにいっちゃいましけどねあせあせ

> .htaccess内の指定は、ファイルの置かれている場所が起点になるので、通常は
> ./mt-dynamic.php で良い筈ですよ。

ちなみに .htaccess は本来どこに置くものなんですか!?
ウチではインデックスはダイナミックにしてないので、ダイナミックにしてる各アーカイブページのトップ( http://bizcaz.com/archives/ )に作成されてました。
なので、ウチでは各修正箇所を /mt-dynamic.php というようにしてます。
友人宅ではドメインのフォルダから blog/ フォルダにサイトを構築してたので、記事中のようにしました。
本来はトップページと同じ場所に置くものなんですか!?

> クエリーから先を渡そうとしているみたいだけど、[L,QSA]なので2度渡ししている様に思えます。
> 通常はファイル名をそっくり私だけのハズですけど。

えっ!! そうなんですか!?
わたし単純にパラメータを mt-dynamic.phpに渡してるだけかと思ってました!!
そういう意味だと詳しくは理解してなかったのですが、特に変更するよう明記もなかったのでデフォルトのままでいいんだろう・・・ということで気にしてませんでしたガーン
PerlDynamic で作成されたファイルやフォルダを削除したら!? 正常に初期化できたっぽく見えたのですが、それって実は .htaccess を削除したからってことですか!?
う~ん・・・でも .htaccess は何度も書き直したり、場所を移動したりってやってたはずなんだけどなぁエーン

#5: Posted by Author Profile Page oscar @ December 9, 2008 [REPLY]
user-pic

>認証元の TypePad Connect が原因かな・・・なんて思ってたりして
やっぱりそうですよね。
リセットとかが必要なのかな?

それでhtaccessですが、基本的に設置したディレクトリ以下に有効になるものなので、アーカイブしか使っていないなら、トップページに置く必要ないですよ。私のところだと、あっちこっちにそれ用のhtaccessが散らばってます。

ダイナミックパブリッシングも藤本さんのPerl版も、呼び出されたファイルのURLをPHPに渡してそれに相当する内容を出力するように動作します。

>特に変更するよう明記もなかったのでデフォルトのままでいいんだろう・・・
あれ?デフォルトに$2とか無かったはずですけど・・・

通常htaccess内に、^(.*)$ですべてのファイル名が、mtview.phpもしくは/mt-dynamic.phpにわたるようになってるけど、正規表現で、特定のファイルだけをがmt-dynami.phpで他はmtview.phpとかが可能ですよ。

#6: Posted by Author Profile Page bzbellからoscarへの返信 @ December 9, 2008 [REPLY]
user-pic

>>5 oscar さん

こんばんわ^^

> やっぱりそうですよね。
> リセットとかが必要なのかな?

まだベータ版ってのもあるかもしれませんよイヤイヤ
以前 oscar さんとこでもサインインしたときに同じ現象だったのでそう思ってました。

> それでhtaccessですが、基本的に設置したディレクトリ以下に有効になるものなので、アーカイブしか使っていないなら、トップページに置く必要ないですよ。

よかったぁあせあせ
わたしもそのように認識してたのですが、もしかして・・・と思ってブイブイ
ありがとございますうるうる

> あれ?デフォルトに$2とか無かったはずですけど・・・

えっガーン!?
わたしのとこ( 友人とこも )だと自動生成で記事中のように出力されました。
なのでそのまま使ってたのですが、そもそも出力された内容がおかしい!? ってことですか!!
oscar さんの >>3 の内容に変えてやってみますねワクワク

 Post a Comment

 

コメント用フィード