CakePHPでBake後、addとeditを統合する
CakePHPCakePHPでCRUD(add,view,edit,delete)をBakeした後、それぞれのアクションを編集して制作を進めていくスタイルだと、addとeditをセットで編集する機会の多さに気付かされます。
ViewのctpテンプレートにもControllerのアクションメソッドにも共通部分が多いのにそれぞれが別物として用意されてしまうためです。
というわけでBakeによって生成されたaddとedit、この2つを統合してみます。
変更点は3箇所
CakePHP2.5.1を使用しました。CakePHP2系なら同様の操作でいけると思います。
例としてpostsというテーブルに基づくMVCで作業します。
Controllerの編集
addメソッドの中身をごっそり削除し、editメソッドを呼んでしまいます。viewもedit.ctpを指定します。
/**
* add method
*
* @return void
*/
public function add() {
$this->edit();//+
$this->render('edit');//+
}
続いてeditメソッドのNotFoundExceptionを発生させるif文の条件に$this->action == 'edit'を加えます。
/**
* edit method
*
* @throws NotFoundException
* @param string $id
* @return void
*/
public function edit($id = null) {
if ($this->action == 'edit' && !$this->Post->exists($id)) {//+
throw new NotFoundException(__('Invalid post'));
}
if ($this->request->is(array('post', 'put'))) {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash(__('The post has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The post could not be saved. Please, try again.'));
}
} else {
$options = array('conditions' => array('Post.' . $this->Post->primaryKey => $id));
$this->request->data = $this->Post->find('first', $options);
}
}
Viewの編集
edit.ctpを開きフォームヘルパーでidのhiddenタグを出力している部分を探しif ($this->action == 'edit'){…}で囲みます。
if ($this->action == 'edit') {
echo $this->Form->input('id');
}
後処理
add.ctpの削除
以上の操作でadd.ctpは不要になりedit.ctpのみで動作するはずです。 動作を確認したら使用しないadd.ctpを削除してください。
edit.ctp内のDeleteボタン
edit.ctp内にDeleteボタンがありますが、まだidが発行されていない状態(addの場合)で使用するとエラーになるので気になる場合はここもif ($this->action == 'edit'){…}で囲みます。
注意点
以上の変更後の注意点としては、このコードではaddのリクエストの場合も$this->Model->create();を実行していないので、
あまりないとは思いますが、事前にモデルを操作してからaddリクエストのsaveを行う場合は必要に応じてcreate()を実行してください。