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