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

これまで紹介したように、今 紹介診療機関のデータベースを 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による表示系に飛ばすということです。でも疑問は、本当にこんなややこしいことせねばいけないのでしょうか?
動作確認ではきちんと動作します。どなたかご教授お願いします。

投稿者: (KAMAKURA & SAPPORO)Dr_Radialist

Expert Interventional Cardiologist and Amateur Computer Programmer

「どうにもスッキリしないのですが・・・」への4件のフィードバック

  1. 鎌倉で救急医をしております。
    齋藤先生がprogrammingにもご堪能でいらっしゃることは噂で聞いておりましたが、本当にPro顔負けの腕前でいらっしゃるのですね。
    私はもっぱらZend派でCake(それも1.3)はあまり詳しくないのですが、Cake流の正しいお作法を一番知っているのはCake開発者達であることは間違いありません。いちいち彼らに尋ねるのも面倒なので、私はいつもCakeのScafoldで出力されるコードを解析するようにしています。すると、参考書(少なくとも日本語のもの)にも載っていないようなエレガントな方法が見つかり感心させられます。
    ご参考までに。

  2. すでに解決していらっしゃるかも知れませんが・・・

    Html->link(‘削除’, array(‘controller’ => ‘physicians’, ‘action’ => ‘delete’, $physicians[‘Physician’][‘id’])); ?>

    とメソッド名をdelete_preからdeleteに修正し、
    PhysiciansController.phpに

    public function delete($id = null) {
    if (!$id) {
    $this->Session->setFlash(__(‘IDが正しくありません’, true));
    $this->redirect(array(‘action’=>’index’));
    }
    if ($this->Physician->delete($id)) {
    $this->Session->setFlash(__(‘削除しました’, true));
    $this->redirect(array(‘action’=>’index’));
    }
    $this->Session->setFlash(__(‘削除できませんでした’, true));
    $this->redirect(array(‘action’ => ‘index’));
    }

    ではいかがでしょうか?

    1. ご指導本当にありがとうございます。今リマにいます。何時のからかインターネットが無くては生きていけない体になってしまいました。
      自分のプログラム能力が低いことは自分で理解しています。その最大の欠点は、ある瞬間にはあるmodalityしかできない、というものです。
      ここ数週間暫く(3年間ぐらい)遠ざかっていたC++の世界に再び戻りました。それまではしばらくjQuery + PHPに2年間ぐらいどっぷりつかっていたのですが、まったく離れています。
      自分で書いたサイトのプログラムを解読するにもいちいち学びなおさねば理解できない、という状況です。CakePHPに関しても同様で、全く離れてしまいました。早くこのようなサポートが頂ければ状況は全くかわっていたと思います。同じ鎌倉に先生のような方がいらっしゃる、ということを知り本当に心強く思います。どうぞ今後とも色々とご指導宜しくお願いします。
      齋藤 滋

      1. ご返事を頂戴し恐縮です。
        リマにいらっしゃるのですか。
        まさに世界を股にかけてのご活躍ですね。
        私はMac一筋なので、OSはBSDベースのOSX、CもObjective Cとかいう方言、あとはRuby、PHPを少々程度しかわかりませんが、なかなか医者仲間でProgrammingの話をできる人がいないので、今後もぜひご教導下さい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です