cakePHP とsmartyを使い、html helperで日本語を使うためのメモ

苦労したので、次のためにメモ

初期

cakePHPsmarty使う方法は
第11回 Smartyとフレームワーク(その1:CakePHP編) - Smarty講座
これ見ればいけるので、省略。


んで、このなかで巧く動かない部分があった。

以下のコードを先ほどのindex.tplに書いてみてください。
  {$html->link('yossy先生のSmarty講座', 'http://www.phppro.jp/school/smarty/')}
http://(ドメイン名)/test/index にアクセスしてみて、リンクは表示されたでしょうか?

「いいえ」

<a href="http://www.phppro.jp/school/smarty/"></a> 

こんな感じで、リンク名が入らない


ちなみに、リンク名を英数字だけにすると

<a href="http://www.phppro.jp/school/smarty/">test</a> 

入る。

原因は..

正直よくわからん。
cakeのversionかもしれないし、smartyのversionかもしれないし、レンサバのPHPのversionかもしれん。。
とりあえず日本語使えるようにしようと思って、試行錯誤。


日本語だけ動かないので、きっと日本語入れた場合に、へんなencoding処理とかしてるんだろうなと思い、cakeのhtml helperのソースを読みに行く

html_helper

ファイルは

  • cake/libs/view/helpers/html.php

260行目

/**
 * Creates an HTML link.
 *
.......
    function link($title, $url = null, $options = array(), $confirmMessage = false) {
        $escapeTitle = true;
        if ($url !== null) {
            $url = $this->url($url);
        } else {
            $url = $this->url($title);
            $title = $url;
            $escapeTitle = false;
        }
        if (isset($options['escape'])) {
            $escapeTitle = $options['escape'];
        }

        if ($escapeTitle === true) {
            $title = h($title);
        } elseif (is_string($escapeTitle)) {
            $title = htmlentities($title, ENT_QUOTES, $escapeTitle);
        }

$escapeTitleっての怪しいな。
三つ目の引数の$options内に、"escape"を定義して渡してあげればいいのか。
渡した"escape"は$escapeTitleに入って、htmlentities関数の第三引数に読まれて、$titleに入る。


なんかあやしそうだから、$optionsに"escape"を定義してみる
htmlentitiesの第三引数はcharsetらしいので、"EUC-JP"を定義する

{$html->link('入口', 'http://hoge.com/pages/home', array('escape' => 'EUC-JP'))}
Fatal Error (256): Smarty error: [in /home/hogehogehoge/app/views/tops/index.tpl line 11]: syntax error: unrecognized tag: $html->link('yossy先生のSmarty講座', 'http://www.phppro.jp/school/smarty/', array('escape' => 'EUC-JP',)) (Smarty_Compiler.class.php, line 446) [APP/vendors/smarty/Smarty.class.php, line 1093]


なんかエラーでる。
今度はこのエラー調べる

CakePHP で Smarty を使用するメモ | Sun Limited Mt.
こちらのサイト様で

ただ、.thtml で HTMLヘルパーを使用している場合
{$html->input('Post/name', array('size'=>'30'))}
のままでは、array(…) でエラーになる。

「はい。同じくarray(...)でエラーになります。。」


というわけで、解決方法として紹介されているpluginを導入してみる。
プラグインは↓

function.assign_assoc.php という名前で保存して、

/vendors/samrty/libs/plugins/

以下に保存。


今度はtpl内で

{assign_assoc var='ArrayName' value='escape=>EUC-JP'}
{$html->link('yossy先生のSmarty講座', 'http://www.phppro.jp/school/smarty', $ArrayName)}

と記述すれば完成。
日本語のリンク名が出ましたよ。


追記

今改めてソース読んだら、単純にhtmlspecialchars関数(cakePHP内ではh関数)と、htmlentitiesに渡すcharsetがデフォルトでISO-8859-1で、EUCでコード書いてたからバグってただけか。
今回は全部EUCで作るつもりだし、html.phpを書き換えちゃってもよかったかも。