no-image

EthnaでUTF8を扱うもっともシンプルな方法

ようやくUTF8での運用に慣れたきがするので、どうやってUTF-8を使っているのか紹介。

EthnaでUTF-8なWebアプリを作る場合、templateをすべてUTF-8で書いてやればいいわけですが、ActionFormのValidateなどで表示されるEthna内部に書かれているエラーメッセージがEUC-JPの為、エラーメッセージが文字化けしてしまいます。

今までは、Ethna全体や、エラーメッセージが書かれたファイルをUTF-8化してみたりしていましたが、結構面倒です。(ちょっと力技過ぎる)

そこで、エラーメッセージを表示するメソッドを継承して文字コード変換を行います。

以下のコード(Ethna_ActionError_UTF8.php)をコントローラーの設定を変更してActionErrorと置き換えるだけです。


<?php
require_once 'Ethna/class/Ethna_ActionError.php';
class Ethna_ActionError_UTF8 extends Ethna_ActionError
{
    /**
     *  アプリケーションエラーメッセージを取得する
     *
     *  @access private
     *  @param  array   エラーエントリ
     *  @return string  エラーメッセージ
     */
    function _getMessage(&$error)
    {
        $af =& $this->_getActionForm();
        $form_name = $af->getName($error['name']);
        $result = str_replace("{form}", $form_name, $error['object']->getMessage());
        return mb_convert_encoding($result, 'UTF-8', 'EUC-JP');
    }
}
?>

これを使うようにすると、ソースコードの文字コード変換と比べて何が楽かっていうと、ae->addでエラーを追加すれば、EUC-JPのままActionから日本語でエラーメッセージが送れるわけです。

便利ですよね。と思ったけどみんなActionError全然使ってない気がしてきたので続き書くのやめる。いや、ae->add使うと、templateのerrorsに入るしis_errorで検出できるので例えばerror.tplってのを用意しておいて、ae->addしたらerror.tplへ飛ばすようにすると、どのActionでも同じテンプレでエラー表示画面が作れて手間が省けてラッキーとかそんなんです。