CakePHP 配列のデータを追加する

PHP

CakePHPでループを使って配列のデータを追加する

たとえば、データが複数あり、これをデータベースに上書きでなくて、追加でしていきたい場合があると思います。

 例:Categoryというモデルにcategory_idsという配列のデータを加えたい
 
 foreach($category_ids as $category_ids){
 		
 	$this->data['Category']['category_id']=$category_ids;
 
 	$this->Category->save($this->data);
 }

上記のようにすると、$category_idsの数だけSQLでUPDATEが実行され、都度、値が上書きされるので、最後の値しか入りません。
そのため、createというメソッドを次のように呼んでやります。

 foreach($category_ids as $category_ids){
 	
 	//createを追加
 	$this->Category->create($data = array());
 		
 	$this->data['Category']['category_id']=$category_ids;
 
 	$this->Category->save($this->data);
 	 		
 }

すると、ループされるたび、INSERTが実行されてデータが追加されます。

元ネタ
http://book.cakephp.org/ja/view/75/Saving-Your-Data

余談ですが、categoryというモデル名にしたために、面倒なことになりました。
データベースのテーブル名はcategoriesで認識してくれます。
ですが、他のテーブルとhasAndBelongsToMany(HABTM)で関連付けるときのテーブル名やID名はcategorysってしないと認識してくれませんでした。[sad]
面倒です…それってそんなものなのでしょうか?
複数名はただ単にsをつけるだけで済むもので命名しておくのがトラブルが少なそうです。

CakePHP 複数形の設定

PHP

CakePHP 複数形の設定

CakePHPではモデルやクラス名を複数形を判断して、自動的に読んでくれますが、それが邪魔になることがあります。

私の場合は、Testphase というモデル、testphaseというテーブルを使いたかったのですが、テーブルをtest_phaseにしろとかでうまく動かないので、設定することにしました。

config/inflections.php内

上記にかいたような例だと、

 $pluralRules = array('/testphase/' => 'testphases');

のようになります。

CakePHP 繰り返す見た目を別ファイルにする

PHP

CakePHP 繰り返す見た目を別ファイルにする

見た目を調整するビューファイルを作っていると、レイアウト以外にコントローラー別でメニューだとか、ナビゲーションを共通化して、外部ファイル化したいということがあると思います。
Smartyのinclude的な使い方です。

そういうときは、elementを使います。

使い方はいたって簡単です。

  1. views/elements/ディレクトリの中に、任意の名前(例:navigation.ctp)でファイルを作成し、その中に共通化したいHTMLやPHPのコードを書いておきます。。ビューのctpファイルを作るのと同じ要領で構いません。
  2. そのelementを呼び出したい個所に、次のように記述すれば終わりです。
 <?php echo $this->element('navigation'); ?>

CakePHP 管理画面をつくる

PHP

プレフィックスルーティングという仕組みをつくって、通常画面と管理画面をわけることができます。

/app/config/core.phpに下記行を追加するか、コメントを外します。

 Configure::write('Routing.prefixes', array('admin'));

「/admin/コントローラー/アクション」にアクセスすると、コントローラーでadmin_で始まる関数が実行されるようになります。

/admin/以下のみアクセス制限をしたい場合は、beforeFilterで$this->params[“admin”]について判定処理をします。
例えば以下の様にAppControllerで処理します。

 class AppController extends Controller {
 
        var $helpers = array('Html', 'Form', 'Session');
        var $components = array('Security', 'RequestHandler', 'Session');
 
        function beforeFilter() {
                parent :: beforeFilter();
                if(isset($this->params["admin"])) {
                        $this->Security->loginOptions = array('type' => 'basic');
                        $this->Security->loginUsers = array('admin' => 'password');
                        $this->Security->requireLogin('*');
               }
        }
 }

http://book.cakephp.org/ja/view/950/%E3%83%97%E3%83%AC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%83%AB-%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-Prefix-Routi