信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    SmartyとCakeの連携について

    みなさんこんにちわ☆彡技術ブログ初投稿のni-yoです。今回はsmarty + cakePHPの連携についての内容です。当社のサイトは言語もフレームワークも様々なものがありますが、その中のサイトの1つにこんな環境があります。■言語:PHP■フレームワーク:cakePHP1.3系■view:Smarty:2.6.26ディレクトリ構造は基本的にはcakeの構造にし、cakeのapp/vendersのしたにsmartyライブラリを設置します。・ControllerからSmarty_Viewへの値の渡し方 ■例1)・Controller.php $data = 'こいつが出したいデータ'; $this->set('data',$data); ・指定url/index.tpl(viewへの配置場所はcakeと同じ、拡張子が.tpl) こんにちわ、これはテストです{$data} 上記のような構造にすると、結果は以下のようになります。『こんにちわ、これはテストですこいつが出したいデータ』上記のように、Smartyではview内に<?php ?>というお決まりのphpタグを記述する必要はありません。値の引渡しは簡単ですね。Controllerでなくview側でphp関数を使いたい時もあるかと思います。例えば、view側でphp関数を用いてencodingをかけたい場合は以下のように記述します。■例2)・Controller.php $data = 'こいつが出したいデータ'; $this->set('data',$data); ・指定url/index.tpl こんにちわ、これはテストです{$data|mb_convert_encoding:'SJIS':'UTF-8'} 上記のように関数処理をかけたい変数に対して『|mb_convert_encoding:'SJIS':'UTF-8'』とつなげてやると変数に対して関数処理を終了した結果がviewに反映されます。viewでヘルパー使いたい時はCakeのヘルパーも形を変えれば使用できますが、弊社では折角なのでSmartyのヘルパーを使ってます。ヘルパーを用いてセレクトボックスを使いたい場合は以下のように記述します。■例3)・指定url/index.tpl {html_options name=namae output=(ドロップダウンリスト出力内容配列) values=(ドロップダウンリストvalue値配列)} 上記のように記述すると、出力したソースを見ると指定した配列分だけoptionを持ったセレクトボックスが作成されます。ヘルパー等については以下のサイトが参考になります。http://www.smarty.net/docsv2/ja/…とまあ、Smartyを使うことでview内にphpの記述をしなくてもいいのでその名の通りスマートなのですが、不便なところも色々あります、一例としては★Shift-JISの問題PC表示側はUTF8 MB表示側はSJISで記述しないといけない場合もあるかと思いますが、その際に問題が起こります。スマーティの基本的なphp変数の呼び出しは上記したとおり『{』と『}』を使うわけですが、SJISは「{」(0x007b)と「}」(0x007d)に相当するコードをふくんでいることがあります。例えば、閲(897B)、顎(8A7B)、宮(8B7B)などがこれに該当します。上記コードはデリミタに含む7Bを含んでいるので、Smartyは{が入っていると判断してしまい、正しく解析できなくなり激しく文字化けします。回避策はググるとだいたい2パターンです。①デリミタ変更$smarty->left_delimiter = '{{';$smarty->right_delimiter = '}}';上記の例はview側のこれはPHPだよってタグを{{と}}に変更してやる方法、これはもうPC側とか管理側をガッツリ{}で組んでたので断念…②プリフィルタとポストフィルタを設定するSmartyテンプレのコンパイル時と出力結果ファイル保存時にエンコーディングを指定する方法です。しかし、この方法もフォルダ構成上SmartyライブラリはPC/SP含む全てのviewに影響を与えるので、全てのviewをSJIS変換されてしまうと困るためこれも断念…ですので、弊社としての対策はリテラルタグの挿入です。■例4 {literal}閲覧注意{/literal} 上記のように、デリミタコードを含む閲のような文字を入れても、リテラルタグを挿入すると文字化けしません。これは、『{literal}』タグで囲まれた中はPHPの変数はありませんよ~っていう意味に出来るからです。あと、Smartyはキャッシュが強力なので開発中は変更部分が切り替わらない、ヘルパーがうまく動作しないなどの不具合をちょいちょい起こしてくれます。うまく動かない時はキャッシュ削除を一度試してみてください。ではでは~!