smartyの最近のブログ記事



PHPでクロージャ


作ってみたものの、実はあんまり用途が思い浮かんでない。


なんとなく、 array_walk がキーワードに浮かんでは来るけど。



てことで、とりあえず smarty で使ってみようと思う。



CakePHP を完全 smarty 化してみたものの、


smarty 内での配列の扱いが微妙だ。


↓事の顛末はこの辺に。


http://d.hatena.ne.jp/am11op/20070614/1181837256


要は、php ならこう書くべきところを



<?php echo $html->link('Edit', array('action'=>'edit', 2));?>

smarty では view に変なメソッド作った上でこう書く必要があった。



{$html->link('Edit', $view->_array('action=>edit', 2))}

まあ、これでもよいんだけど、せっかくなんで closure (的なもの)を使ってみる。


Closure はこんなの。



class Closure {
var $_args;
var $_func;
/**
* @private
*/
function Closure($func=null, $args=null) {
if ($func) {
$this->_args = $args;
$func = ereg_replace("^function\([^\)]*\) *\{", "", $func);
$func = ereg_replace("\}$", "", $func);
$this->_func = $func;
}
}

/**
* @param $func string closure
* @param $arg1 $mixed first object/var which is used in $func
* @param $arg2 $mixed second object/var which is used in $func
* ...
*/
function bind() {
$args = func_get_args();
return new Closure(array_shift($args), $args);
}

/**
* use this method to call closure
*/
function call() {
$func = create_function('$args', $this->_func);
return $func($this->_args);
}

function func() {
$args = func_get_args();
$obj = new Closure(array_shift($args), $args);
return $obj->call();
}
}


無駄にインスタンス量産してるのは、書き直すのが面倒だったから。


このクラスを closure という名前で assign_by_ref してやって、


smarty 内からこう使う。



{*$html->link('Edit', $view->_array('action=>edit', 2))*}
{$html->link('Edit', $closure->func("return array('action'=>'edit', 2);"))}

文字数増えてる!


ネタです!


まあ、ちょっと変数を php で処理して何かのメソッドに渡したい時、


一回しか使わないような modifier をいちいち作らなくてよいので便利かも。


ただし、入力値に対して使う場合は任意のコードを実行されないように気をつけること(棒読み)。




donwload


これは何?


php フレームワーク CakePHP を smarty 対応したものです。


bake コマンドにより生成される html 及び、その書き出し元となる html テンプレートを smarty 化します。


もちろん、標準の bake コマンドや cake テンプレートとの併用も可能です。


更新履歴



20070702

cake_smarty_0.1.2.11 template を調整

20070619

cake_smarty 公開 (0.1.2.1)

cake bake の代わりに cake burn を使うことで smarty テンプレートを書き出すことができます。


ケーキ焦げてます。


動作環境


今のところ cake_1.2.0.5146alpha.tar.gz でしか確認していません。


しかも windows 環境下でしか確認してません。


別途、以下ライブラリを必要とします。



準備



  1. cake_1.2.0.5146alpha を用意

    • 万が一、既存のプロジェクトに適用する場合は必ずバックアップを取っておいてくださいね。



  2. cake_smartyを download

  3. 2. を解凍したファイルを1. に上書きコピー

  4. vendor に smarty をコピー

  5. app/views にSmarty View class を「smarty_view.php」としてコピー

  6. app/app_controller.php の設定

    • app/app_controller.php がない場合は cake/app_controller.php をコピー

    • 以下のように記述





class AppController extends Controller {
var $view = 'SmartyAll';
}

使い方



  • db の設定等、諸設定は終わってるものとします

  • コマンドラインから cake/console/ へ移動

  • cake bake の代わりに cake burn コマンドを使う

    • cake burn から書き出される view は smarty テンプレートです。




元テンプレートが以下ディレクトリにあるので、自由にカスタマイズしてください


cake/console/libs/templates/views/smarty/


todo


smarty の array の扱い方が変。



$view->_array('key=>value')

もっとよいやり方がきっとある。何となくイメージもできてる


その他


php もまだまだ捨てたもんじゃないと思い始めました。


使用は自己責任でお願いします。



疑問・質問・フィードバック等お気軽にどぞ