どうにもスッキリしないのですが・・・

これまで紹介したように、今 紹介診療機関のデータベースを CakePHP 2.0を用いて作成しようとしています。データ構造は簡単です。基本的に二つのテーブルがリンクしているのみです。診療機関には複数の医師が存在しますので、 clinicsテーブルと physiciansテーブルの間には 1:n の関係があります。使い勝手を良くするために、以下の画面を考えています。

<h2>クリニック情報の編集</h2>
<?php echo $this->Form->create('Clinic'); ?>
<?php echo $this->Form->input('clinic_name', array('label'=>'クリニック名')); ?>
<?php echo $this->Form->input('clinic_kana', array('label'=>'クリニック呼び名')); ?>
<?php if(!empty($physicianList)) { ?>
	<table>
	<tr>
    <th>医師名</th>
	<th>医師呼び名</th>
	<th>編集</th>
	</tr>
	<?php foreach($physicianList as $physicians): ?>
	<tr>
	<td><?php echo h($physicians['Physician']['physician_name']); ?></td>
	<td><?php echo h($physicians['Physician']['physician_kana']); ?></td>

    <td><?php echo $this->Html->link('追加', array('controller' => 'physicians', 'action' => 'registration', $physicians['Clinic']['id'])); ?>
	<?php echo $this->Html->link('削除', array('controller' => 'physicians', 'action' => 'delete_pre', $physicians['Physician']['id'])); ?></td>
	</tr>
	<?php endforeach; ?>
	</table>
<?php } ?>
<?php echo $this->Form->input('postal', array('label'=>'郵便番号')); ?>
<?php echo $this->Form->input('address', array('label'=>'住所')); ?>
<?php echo $this->Form->input('phone', array('label'=>'電話番号')); ?>
<?php echo $this->Form->input('fax', array('label'=>'ファックス番号')); ?>
<?php echo $this->Form->input('kakaritsuke_flag', array('label'=>'かかりつけ登録医です')); ?>
<?php echo $this->Form->input('comment', array('label'=>'備考')); ?>
<?php echo $this->Form->input('map', array('label'=>'地図情報')); ?>
<?php echo $this->Form->input('id', array('type'=>'hidden')); ?>
<?php echo $this->Form->end('修正'); ?>
そして、PhysiciansController.phpでは以下のように受けようと思っています。
<?php
	//edit
	public function edit($id = null) {
		if($this->request->isPost()||$this->request->isPut()) {
			if(!empty($this->data)) {
				if($this->Physician->save($this->data)) {
					$this->Session->setFlash('保存しました');
					$this->redirect(array('action'=>'index'));
					return;
				}
			}
			//error
			$this->setFlash('保存に失敗しました');
		} else {
			//$id dataを読み込む
			if(!is_null($id)) {
				$this->data = $this->Physician->findById($id);
			}
		}
	}
	//delete
	public function delete_pre($id = null) {
		$this->data = $this->Physician->findById($id); // Physiciansのデータを $this->dataに読み込むのに必要
		$this->render('delete');
		$this->delete();
	}
	public function delete($id = null) {
		$clinic_id = $this->data['Physician']['clinic_id'];

		if($this->request->isDelete()) {
			$this->Physician->delete($this->request->data['Physician']['id']);
			$this->redirect(array('controller' => 'clinics', 'action' => 'edit', $clinic_id));
			return;
		}
	}
?>

ここでのミソは、一旦 delete_preアクションに飛ばし、そこで該当する idのデータをデータベースから読み込み、それを $this->dataに格納し、それから render()メソッドを用いて delete.ctpによる表示系に飛ばすということです。でも疑問は、本当にこんなややこしいことせねばいけないのでしょうか?
動作確認ではきちんと動作します。どなたかご教授お願いします。

2012-06-07 やはり

やはり CakePHP2.0で僕と同じように悩んでおられる方がおられました。
昨日このページにヒットしました。
この記述が正しいか否かは未だ試していませんが、少なくとも モデル ではなく、コントローラーだと思います。
今日ライブデモンストレーション症例終了してから試してみます。

2012-06-06 再び CakePHP – 2.0でのキャンセル、リセット・ボタンの判別

  echo $this->Form->create('Physician', array('type' => 'delete'));
  echo $this->Form->input('id', array('type' => 'hidden'));
  echo $this->Form->submit('削除', array('name' => 'delete'));
  echo $this->Form->submit('キャンセル', array('name' => 'cancel', 'type' => 'reset'));
  echo $this->Form->end();

というフォームを作成し、PhysiciansController.phpの中で、’delete’という名前と’cancel’という名前のボタンが押されたことをそれぞれ判別したいのですが、どちらのボタンを押しても、delete()というアクションに飛んでしまい、その中でボタンの判別ができないのです。
随分と色々試したり、コントローラーの中で pr()関数を用いて、どのようにオブジェクトが飛んでくるかを表示させたりしたのですが、ボタンを判別できるようなプロパティは無いのです。
それでコントローラーでの判別を止めて、以下のようにJavascriptと組み合わせることにしました。

上と同じなので省略ね
 echo $this->Form->submit('キャンセル', array('name' => 'cancel', 'onClick' => 'history.back()'));
  省略ね

これでとりあえずキャンセルボタンを押せば削除がキャンセルされて前のページに戻るようになりました。
うーん これは CakePHP流なのでしょうか? どうもすっきりしません。どなたかケーキ屋さん、教えて下さいな。

2012-06-05 CakePHP 2.0での POST dataの受け方

小倉ライブデモンストレーション前より悩んでいたことが解決
この親切なページのお陰です。
しかし、やはり同じように悩んでおられた方がおられたのですね。
僕はその歴史を良く知らないのですが、CakePHPはその前の Major versionである CakePHP 1.3から 現在の最新versionである CakePHP 2.0に移行中なのですが、問題は現在インターネットや書籍での解説はほとんどが 2.0ではなく 1.2 or 1.3のものなのです。
それらの解説を読めば

$this->params['forms']['id']

とすれば POSTで渡された $idを受けとることができる筈なのです。
しかし、そもそも $this->paramsなんて CakePHP2.0では無いのです。
それと同等の働きをするのが、何と

  $this->request->data['Model']['id']

なのです。もちろんここでのModelはそのデータが属するモデルであります。
これで懸案のプログラムが矛盾なく、しかもエレガントに動くようになりました。

2012-06-04 懸案事項の解決

小倉ライブの前から CakePHPのあるプログラムを書いていて頭を悩ましていました。ここに二つのテーブルがあります SQLで書けば

CREATE TABLE `clinics` {
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `clinic_name` VARCHAR( 255 ) NOT NULL DEFAULT '',
  CONSTRAINT PRIMARY KEY (`id`)
} CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `physicians` {
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT,
  `physician_name` VARCHAR( 255 ) NOT NULL DEFAULT '',
  `clinic_id` INT( 11 ) NOT NULL DEFAULT '0',
  CONSTRAINT FOREIGN KEY (`clinic_id`) REFERENCES `clinics` (`id`),
  CONSTRAINT PRIMARY KEY (`id`)
} CHARACTER SET utf8 COLLATE utf8_general_ci;

このような二つのテーブルがありもちろん`clinic_id`.`id`は`clinic`テーブルの`id`を参照しており、`clinics`テーブルと`physicians`テーブルは 1:n の関係でリンクしているのです。
このような良くあるデータ構造の時に、修正画面を作るとすれば、僕であれば次のような画面を作成します

       診療所情報の修正画面

診療所名前    : ここに登録されている診療所名前が出る

診療所医師名   1: 名無しの権兵衛  [登録医師削除]
         2: 明日晴れのすけ    [登録医師削除]

         [修正][キャンセル]

このようにすれば、診療所名前修正もできますし、登録されている医師名の削除もできます。
CakePHPを用いてこのような画面出力の作成は一日もかからずにできました。しかし、問題は医師名削除だったのです。これが一筋縄では行かなかったのです。何とか動作するプログラムを書くことはできましたが、どうもすっきりしないのです。これが本当に CakePHPのお作法として正しいのでしょうか? はなはだ自信がありません。
何れにしてもこの過程で明らかになったことがあります。CakePHPはその根本に MVC (Model-View-Controller)という良く使われるアーキテクチャを用いているのですが、僕の問題はその MVCを本質的に理解していないのでは? ということなのです。
こんな時に、誰か身近に意見を聴ける方がいて下されば良いのですが・・・・ 実際インターネット質問欄に投稿しようとしても、コードが長くなり失礼と思えるので、なかなかできないのです。どうしましょうかね・・・