2012年12月19日水曜日

[cakephp 1.3] コンポーネントをViewから使う

こういうコンポーネントをViewからコールする
class UtilsComponent extends Object {
    function pdate($id) {
        $Picture = ClassRegistry::init('Picture');
        $tmp = $Picture->read('modified',$id);
        return $tmp['Picture']['modified'];
    }
}
同じ名前のヘルパーを作成する。このヘルパーを通してコンポーネントをコールする。
App::import('Component','Utils');
class UtilsHelper extends AppHelper {
    function __call($methodName, $args) {
        $utils = new UtilsComponent();
        return call_user_func_array(array($utils, $methodName), $args);
    }

    //もちろんこのヘルパー内に他の関数を書いてもよい。
}
上記により、UtilsHelperに存在しない関数はUtilsComponentの呼び出しに変換される
コントローラで
var $components = array('Utils'... その他のコンポーネント);
var $helpers = array('Utils', ...その他のヘルパー);
と定義しておけば、ビューからは

$this->Utils->共通コンポーネントの関数()

と呼び出すことで、コンポーネントの関数を呼び出すことができる。

[cakephp 1.3] コンポーネント内でモデルを使う

コントローラでusesしているモデルであれば

class UtilsComponent extends Object {
    private $controller;

    public function initialize(&$controller)
    {
        $this->controller = $controller;
    }

    function pdate($id) {
        //コントローラーのusesにあるもの
        $tmp = $this->controller->Picture->read('modified',$id); 
        return $tmp['Picture']['modified'];
    }
}

これでいける。
しかし、呼び出し元のコントローラでusesしていないとエラーになってしまう。
それでもう一つの方法である。controller::loadModel()を使うのだがこれは コントローラーでしか使えないみたいなので同じ動きをする ClassRegistry::init()を使う。
その場合は

class UtilsComponent extends Object {
    function pdate($id) {
        $Picture = ClassRegistry::init('Picture');
        $tmp = $Picture->read('modified',$id);
        return $tmp['Picture']['modified'];
    }
}

2012年12月17日月曜日

[cakephp 1.3] コンポーネント内でヘルパーを使う。

App::import('Helper','Html');
$html = new HtmlHelper();

[cakephp 1.3] ヘルパー内でモデルを使う

$event = ClassRegistry::getObject('Event');
$tmp = $event->read('modified', $id);
echo $tmp['Event']['modified'];

こんな感じでClassRegistry::getObject()を使う。