MODxで携帯コンテンツ


MODXで携帯のコンテンツを作るためにちょっと色々と試してみた。MODx自体は文字コードUTF-8で作られてるんだけど、携帯の文字コードはShift_JISなのでそこをどうしようかなぁと。
こういうときはプラグインでOnWebPagePrerenderを引っ掛けて、最後の出力部分のところでUTF-8からShift_JISにコンバートかけてあげれば文字コードに関してはOK。
で、次はContent-Typeの変更。こちらもUTF-8になってるので、Shift-JISに変える。というわけでShift_JISにコンバートするついでにこんなini_setを入れてみた。

ini_set (”default_charset”, “Shift_JIS″);

…Content-TypeがUTF-8から変わらない。何故だ。。。
MODxのどこかでini_setかheaderでも定義してるのかなぁと思って、ソース全体を適当にgrepしてるとheaderでContent-Typeを指定している部分があった。


./manager/includes/document.parser.class.inc[471行目付近]
header('Content-Type: ' . $type . '; charset=' . $this->config['modx_charset']);

なるほど、$this->config['modx_charset']);でContent-Typeを指定しているのかぁ。
って事はini_setの代わりにこんなやつを入れてみたらどうだろう?

$modx->config['modx_charset'] = 'Shift_JIS';

…だめだ、UTF-8から変かわらねぇ。
というわけで今度はソースをちょっと見てみる。
headerでContent-Typeを設定している部分はoutputContentという関数らしい。名前からして最後のコンテンツ(HTML)の出力やってる処理っぽい。ふと、気になったところ。

./manager/includes/document.parser.class.inc[426行目付近]
function outputContent($noEvent= false) { …中略… header('Content-Type: ' . $type . '; charset=' . $this->config['modx_charset']); …中略… if (!$noEvent) { $this->invokeEvent("OnWebPagePrerender"); } echo $this->documentOutput; ob_end_flush(); }

…(゜□゜)…ポカーン。
うへぇ、headerでContent-Type指定してからプラグインのOnWebPagePrerenderイベントが呼ばれてるのか。ってーことはここでどんなにdefault_charsetの設定をいじろうとしてもダメなのかぁ。
ここの処理は逆にしてほしいところだったなぁ。って思うのはShift_JISやらEUC-JPやらJISと色んな文字コードが溢れてる日本人だけなんだろうな。。。多分(他にこういう状態な国はあるのだろうか?)。

仕方ないのでOnWebPagePrerender以外でOnWebPageInitイベントもフックして、ここにMODxのCharsetを変える設定を入れた。
と、言うわけでこんなプラグインを作ってみた。イベントはOnWebPagePrerenderとOnWebPageInitにチェック。

//------------------------------------------------------------------------ // // UTF-8 to Shift_JIS for MODx // // Author : soushi // Version : 1.00 // Date : 2007/12/25 // //------------------------------------------------------------------------ // parent id of target document $parentId = 10; switch ($modx->Event->name){ case "OnWebPageInit": $id = $modx->documentIdentifier; $parentIds =array_flip($modx->getParentIds($id, 100, array($id))); if( isset($parentIds[$parentId]) ) $modx->config['modx_charset'] = 'Shift_JIS'; break; case "OnWebPagePrerender": $id = $modx->documentIdentifier; $parentIds =array_flip($modx->getParentIds($id, 100, array($id))); if( isset($parentIds[$parentId]) ) $modx->documentOutput = mb_convert_encoding($modx->documentOutput,'SJIS','UTF-8'); break; }

このプラグインの動作は$parentIdに設定したドキュメントID配下のドキュメントがすべてがコンテンツ出力時にUTF-8→Shift_JISに変換されます。動作検証はまだ適当にしかしてないけど多分大丈夫。。。かな。


※2007/12/17の日記に追記

作成日:2007/12/26 01:40:32
トラックバック  ※トラックバックは承認後に表示されます。
TrackbackURL:このページのトラックバックの受付は終了しています。

トラックバックはありません。
コメント
名前:

タイトル:

コメント: