Seo tools

Neo Inspiration

  • Search

    • About Me

      • inspi 改め
        jakk@webアーキテクト(自称)
        php,javascript,seoなど
        得意技は extract();



  • Categories

  • Ranking

  • Comments

  • Others


    • track feed   |
  • requestAction() じゃなくてcompornentを使う

    どんなサイトでもたいていの場合 同じことが繰り返し表示される部分があります
    そのソースを毎回書くのじゃなく、どっかに書いてそれを再利用しましょう
    ということを考えるわけですが、
    それのcakePHPでの解決方法を考えて見ます。(浅い知識で)

    cakePHPでそれを解決する方法が
    ぱっと2個あります。
    (AppContoller に書くなんてこともあるので3つか。。)

    1:requestAction() を使う

    簡単に言えば別のコントローラのfunctionにタッチできますよということらしいです。
    でもこれ、private functionはできない( _ で始まる名前のfunction)とのこと。

    これって要は 外からURLぶったたいた結果を持ってきますよーってことみたいです。

    なんとなく強引なイメージがありますね。
    そもそも画面の一部分だけを 外でたたけちゃうのはいやだし。

    2:compornent を使う

    それで他にないのかなーと探してました。
    できればパーツ専用のコントローラを作ってそれを $this->** みたいに読み出すような形にしたかった。
    *けど Appcontoroller には書きたくないし。。。

    と思ってたら compornent というものを発見しました。

    「目標は再利用性(reusability)です。」
    URL:http://cakephp.jp/doc/components.html

    おおお KOREDA!

    ということで以下使い方メモ
    (といっても簡単です。)

    構成的に
    ・TOP画面 (top_contoroller.php)
    ・TOPの中にプロフィールを常に表示するパーツ(parts.php)

    という感じのイメージです。

    1:まず適当にコントローラを作る(top_contoroller.php)

    適当に

    Class TopController
    {
         //DB接続
         var $uses = array(’ここで使うモデルたくさん’,'パーツで使うモデルたくさん’);
         //Compornent接続
         var $components = array(’Parts’,'パーツPHPのクラス名’);

         function index()
         {
              //適当にset
              $this->set(’title’,”とっぷぺーじ”);

              //Compornentからのデータをセット
              $this->set(”profile”,$this->Parts->パーツのメソッド());
         }
    }

    とします。

    ここで注意点
    ・この時点で $uses にパーツで使うのに必要なモデルも呼び出しておくこと

    ・パーツへのアクセスは

         var $components = array(’Parts’,'パーツPHPのクラス名’);

    ここでやります。
    これは /app/controller/compornent/ にある parts.php を見に行って
    Partsクラスを呼び出します。

    で最後そのメソッドを使用するには

         $this->Parts->パーツのメソッド();

    こんなかんじです。

    2:コンポーネントを作る(/app/controller/compornent/parts.php)

    /app/controller/compornent/ に parts.phpを作って
    ごりごり書けばOK。

    といってもとりあえず書き方にちょっとこつがあったので、書いておきます。
    これもしかしたら普通にAppControllerを継承すればいいだけかも?

    Class PartsComponent extends Object
    {
         var $Controller;

         function startup(&$controller)
         {
              $this->Controller =& $controller;
         }

         function profile()
         {
              //プロフィール出力処理
              return $this->Controller->モデル名->read();みたいな
         }

    ・・以下ごりごり

    まずファイル名に対応するクラスを作ります(他のコントローラみたいに)
    で語尾がCompornent。

    次に appcontrollerを継承するのじゃなくなぜか、Objectを継承します。
    理由とか不明w(時間あったら調べます。。。)

    で、最初の

    function startup(&$controller)
    {
         $this->Controller =& $controller;
    }

    ここで呼び出し元controllerを参照してそのモデルとかを持ってきます。
    要はコントローラ<>コンポーネントでの中継部分かな。
    これでcompornentファイルでcontrollerと同じようにごりごりかける設定が終了。

    あとは書くだけですが、一応モデルへのアクセスは

         //これじゃだめ
         $this->モデル名->read();

         //こう書く
         $this->Controller->モデル名->read();

    これでパーツだけ別ファイルに切り出して管理も楽だし、
    追加とかも楽 なハズ?

    他にもやり方あったら教えてください!


    Leave a Reply

    2009/01/07 09:25:32