Cake PHP HABTMの関連データが表示されない

PHP

Cake PHP HABTMのデータが表示されない

CakePHP 1.2.3.8166

CakePHPでHABTMのデータが表示されない場合、次の部分をチェックしてみてください。

  1. コントローラー内に
 $this->モデル名->recursive = 0;

が入っていないか

recursiveを0に指定していると関連データが制限されます。
参考 recursive
http://book.cakephp.org/view/439/recursive

bakeで作ると、自動的に入れてくれるんですよね(^_^;
ちょっと悩んでしまいました。

Cake PHP HABTMのデータをチェックボックスに表示する

PHP

CakePHP HABTMのデータのチェックボックスを作る

cake PHP 1.2.3.8166.

PHP

以前、Cake PHP チェックボックスを作るにて、チェックボックスをフォームヘルパーで作る方法を書きましたが、HABTMの構造から、いとも簡単にチェックボックスを作る方法を書いておきます。

HABTMとは何ぞや?という話については、下記を参考にしてください。
http://book.cakephp.org/ja/view/83/hasAndBelongsToMany-HABTM

多対多の関連をもつデータ構造です。

さて、ではサンプルとして、下記のような2つのテーブルを関連づけたいとします。

 クラス名:Student
 テーブル名:students
 id       name
 1        孫悟空
 2        ヤムチャ
 3        天津飯
 クラス名:Teacher
 テーブル名:teachers
 id       name
 1        亀仙人
 2        桃白白
 3        カリン様

Student(弟子)は多くのTeacher(先生)を選ぶことができ、先生も、多くの弟子を持つことができます。
【注意】:フィールドの名前を、idとnameにしておかないと、チェックボックスフォームに自動的に反映されません!
(けっこう悩みました)

それぞれを関連させるために、
student_teachers
というテーブルを作ります。
クラス名は’StudentTeacher’ です。

【注意】:HABTMのテーブルはマニュアルサイトなどもみると、上記の例だと
“students_teachers” 複数形_複数形というテーブル名が正しいはずです。
私の環境だと、student_teachers 単数形_複数形にしないとうまく動きませんでした。なので、上記のように書いてあります。

そのほか、モデルの設定やコントローラーでのHABTMの設定は、正しくしておいてください。

ではやっと、弟子を一人追加するフォームを作ります。addというメソッドを使います。
当然、先生を複数選びたいので、チェックボックスフォームを使います。

 コントローラーに記載
 function add(){
 $this->set('teachers', 
            $this->Student->Teacher->find('list')
 	);
 //以下コントローラーのコードが続く 
 ビューに記載
 <?php 
 echo $form->input('Teacher',array('multiple'=>'checkbox'));
 ?> 		

なんとこれだけで、終わり!すばらしいです。
チェックボックスができるのを確かめてみてください。

参考:下記のページに地味に書いてありますw
http://book.cakephp.org/ja/view/189/Automagic-Form-Elements

  • これはすごい!これで解決だ!と思ったんですけど、保存がうまくできませんでした。うーむ。まだまだ解決まで遠いようです(;_; — ほ {2009-10-24 (土) 21:38:50}
  • と書いたら解決しました!まさに奇跡!!まず’multiple’=>’checkbox’はarray(‘multipe’ => ‘checkbox’)ですね。あとは、$this->set(‘teachers’はいいんですが、それに対して、viewのところは$form->input(‘Teacher’でした!!!このページがとっかかりになって解決です!!とてもとてもありがとうございました!! — ほ {2009-10-24 (土) 21:48:44}
  • ほ様ご指摘、ありがとうございます!その通りですね。訂正しておきます! — AG {2009-10-26 (月) 19:06:25}
  • HABTMを検索してここに来ました。素晴らしい機能ですね!ありがとうございます! — bltk {2010-03-18 (木) 11:11:05}

Cake PHP ACL 特定のアカウントだけ編集できるようにする

PHP

CakePHP 特定のアカウントだけ編集できるようにする

cake PHP 1.2.3.8166.

Webアプリケーションでよくあるのは、ユーザーにユーザー自身のアカウントやプロフィールを編集させたいが、他のユーザーのものは見せたくないという動作ですよね。

Acl、Auth の機能を使ってなんとかさくっとできそうですが、残念ながらできません。
こちらのページにそんな場合の方法が書いてありますので、参考にしてください。

CakePHP ACL and Auth: Record Level Protection

簡単に内容を紹介させて頂きます。

上記のように、Acl、Auth の機能を使ってすぐになんとかというのはできないようです。

そのため、自分でfunctionを作るしかないです。
前提条件で、以下のことをやっておいてください。

  • ユーザーがAROとして関連づけされていること
  • そのAROが、UsersControllerへアクセスできるようにACOが設定されていること
  • AROがedit function へアクセスできることたとえばユーザーに、自分のIDしか編集させたくない場合
 //レコード番号がログインしているユーザーIDと同じであれば
 //Trueを返し、そうでなければFalseを返す。
 //Aran worldさんでは$idではなく$recordIdとなっていました。
 // UsersControllerへ記述
 
 function checkUsersOwnRecord($id)
 	{
     if( $this->Auth->user('id') == $id ){
         return TRUE;
     	  } else {
 		return FALSE;
     	  }
 	}

編集functionに、この戻り値を判定させます。

 // UsersControllerへ記述
  
 //ユーザー編集
 function edit($id = null) {
 //ユーザー本人かどうか確認
 if($this->checkUsersOwnRecord($id)){

ユーザー本人だった場合の処理

 
        }else{
 
  	$this->Session->setFlash('このエリアへのアクセスは禁止されています。');
       $this->redirect(array('action'=>'index'));
 
   }		

ほかにも、下記のサイトでは管理者の場合すべてのアカウントを編集できるようにする方法などが載っています。
とても説明が丁寧なので、ぜひ参考にしてみてください。[smile]
CakePHP ACL and Auth: Record Level Protection

Cake PHP ACL TOPページへのアクセスを設定する

PHP

CakePHP Cake PHP のTOPページへのアクセスをコントロールする

cake PHP 1.2.3.8166.

Cake PHPでサイトを作成していった時、webroot/へアクセスするアクセスコントロールの設定です。

なお、手動でACLを設定されている方にはあまり参考にならないかもしれません。

本家のマニュアルサイトを見て、自動でACOリストを生成してくれるfunction initDB() を使った場合の話です。

DBからACOをみると、

 Pages
 - display

というACOが作成されていて、?と思います。
このPages、がwebroot/へのアクセスのACOのようです。

ここにアクセスできるようにしておかないAROは、webroot/へアクセスすると自動ループになってしまい、Webサーバーが落ちるとか、ブラウザが応答しません。
どうやら、webroot/へのアクセスのリダイレクトがwebroot/になっているからのようです。

また、他のコントローラーで細かく設定したACLが自動ループになってしまうのも、得てしてこれが原因かもしれません。
戻りページがない場合、webroot/へリダイレクトされるようになっているようです。

なので、TOPページ(webroot/)へのアクセスを、前述のfunction initDB()内に下記のように書きましょう。

 // 例:グループIDが6のグループにTOPページへのアクセスを許可する場合
 $group->id = 6;
 $this->Acl->allow($group, 'controllers/Pages');

参考:CakePHP マニュアルサイト Pages Controller

Cake PHP 2.0データベース接続設定

PHP
データベースの接続設定をするにはapp/config/database.phpを編集します。もしそのようなファイルがない場合はdatabase.php.defaultを雛形にして database.phpを作成します。

public $default = array(
‘datasource’ => ‘Database/Mysql’,   /* 使用するデータベース */
‘persistent’ => false, /* 持続的接続をするか falseでいいと思われます。*/
‘host’ => ‘localhost’, /* 接続先ホスト */
‘login’ => ‘test’,    /* データベースのユーザー */
‘password’ => ‘testpass’,   /* パスワード */
‘database’ => ‘test’,   /* データベース名 */
‘prefix’ => ”,  /* テーブルの接頭語 */
‘encoding’ => ‘utf8’ /* 文字コード */
‘unix_socket’ =>”          /* ソケットを通じて接続するときに 記述します。*/
);

以前のversionだと
‘datasource’が’connect’
‘unix_socket’が’port’
であったり記述の仕方がかわっているので注意が必要です。