Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

タグ:Smarty

2.0 stableになってからまともにCakePHPに触れてなかったので、とゆーか、普段1.2系に触れてるのもあって、様変わりしてる2.0系は弱いんだよねー。


強いてSmartyを組み込みたいが為にGoogle先生にお世話になったメモ。
 

先生に「cakephp 2.0 smarty」と質問するとこのURLを教えてくれます。

http://www18.atwiki.jp/javascripter/pages/26.html

ま、一番目にヒットする内容のページが広告などなどで崩れてるのもあって整形してくれてるWikiみたいなんだけれど、とりあえずこのソースをコピって /app/Views/SmartyView.php を新規作成してペーストした。

-$this->subDir = 'smarty'.DS;
+$this->subDir = ''; 

ソースの中でこの修正をしておかないと、例えば /Views/Pages/smarty/display.tpl を読み込むので /Views/Pages/display.tpl とストレートにお願いしたいから(ctp共存の仕様なのかな?知らない)。

あと、Layoutsの中だけは /smarty/default.tpl じゃなくて何故かそのまま default.tpl を読むので…。


ちなみに、コピペのソースだと routes.php でテンプレートが指定されてても無視してメソッド名のテンプレートを呼んだので別途対応しないとそれは機能しないかもしれない(デフォルトでは pages コントローラの display メソッドが実行されて home テンプレートを呼ぶはずなのにそのまま display だった)。

↑ものすごい勘違いで、CoreにあるPagesController.phpではパラメータとしてrender()に設定されるからhomeテンプレートが読み込まれるのであって、ユーザコントローラ(app/controller/PagesController.php)を作った際に特別処理しなければ普通にdisplayテンプレートが呼ばれる挙動で正常だった orz


以上が整えば、各コントローラのクラス変数 $viewClass = 'Smarty'; でおk!

ってそんな面倒なことはしないよね…、AppController で指定したら継承するだけでおk!


class AppController extends Controller {
  public $viewClass = 'Smarty'; # Smartyって書いとくとSmartyViewとして先のファイルをロード
}



最後に最初にやるべき内容を補足しとくと、Smartyをダウンロード&解凍したら

  1. libs → smarty へフォルダ名リネーム
  2. /app/Venders/smarty として設置

 
もちろんネイティブに<?php echo $name; ?>とかショートタグで<?=$name?>の方が軽いと思うよ。

でもショートタグは推奨されないしさー、もうテンプレの可読性で嫌になる時もしばしば。


だから {$name} とか書きたいじゃん?(´・ω・`)おれだけ?


 
みんなが幸せでありますように!


慣れてるテンプレートエンジンが一番!

もちろん、ごくごくネイティブに近く?コーディングされているDooPHPの速度は落としてしまうかもしれないが…やっつけてみた。

利便性優位。(なら、DooPHPなんて本末転倒?)

何故か急にDooPHPw

ドキュメントが少なくてイマイチ理解してない。

でも見た感じ、ハードコーディングされてるっぽいし…継承してユーザクラスでオーバーライドしたりっていうのは準備されてないと思う。
# autoloadを利用すれば可能そうでした。フックは用意されてない…かなぁ、beforeRun, afterRunあたりでなんとか…。

  1. Smartyを拾ってきて解凍した後、libsフォルダをsmartyへリネームして /app/protected/library 配下に置く(libraryは作成した。別にリネームしなくてもいいし、置き場所も適宜。どこに置くべ…と思ってとりあえず。)
  2. /dooframework/view にDooViewSmarty.phpを作成する(ファイル名も適宜)
  3. /app/protected/config/common.conf.phpにテンプレートエンジン設定を追加
  4. (゚д゚)ウマー (/app/protected/viewc に書き込み権限を忘れずにー)

common.conf.php
$config['TEMPLATE_ENGINE'] = 'DooViewSmarty';

DooViewSmarty.php
include_once 'DooView.php';

class DooViewSmarty extends DooView {

    private $smarty;

    public function __construct() {
        include_once Doo::conf()->SITE_PATH.'protected/library/smarty/Smarty.class.php';

        $this->smarty = new Smarty();

        $this->smarty->compile_dir = Doo::conf()->SITE_PATH.'protected/viewc';
        $this->smarty->template_dir = Doo::conf()->SITE_PATH.'protected/view';
        $this->smarty->assign('SITE_PATH', Doo::conf()->SITE_PATH);
        $this->smarty->assign('BASE_PATH', Doo::conf()->BASE_PATH);
    }

    public function render($file, $data = NULL) {
        foreach($data as $key => $val){
            $this->smarty->assign($key, $val);
        }
        echo $this->smarty->fetch($file.'.html');
    }
}

DooPHPのレンダリングは $this->render() なので、そのメソッドをやっつけた。

DooView.phpに手を加えないよーに継承して別ファイルにしたけど、DooView.phpにコンストラクタ追記(コンストラクタじゃなくても)して、render()じゃなくview()メソッドでも良いと思うし、好きな方法で(´・ω・`)

てか、DooPHPを使うことが稀だと思うけどね。


あとはいつものとおりSmartyでテンプレートを書く。



↑このページのトップヘ