CakePHP3.0の安定版が既にリリースされているにもかかわらず、1.3を使い続けています!!
個人的には新しいものを使っていきたいのですが、納品するのには運用実績のあるものの方が安心なので使い続けているのですが、
3.0のbakeは魅力的ですね。そのまま管理画面でも問題ないぐらいになっています。
でも、今回はそんな話ではなく、1.3での削除処理の実装です。
簡単にやってしまえば。
function admin_delete($id = null){ $this->Item->delte($id); }
ですが、誰が使うか分からないシステムなのでそんな訳にはいきません!!
必要そうなものを実装するとこんな感じになりますね。
function admin_delete($id = null){ if(!($id && is_numeric($id))){ $this->Session->setFlash('対象IDが存在しません。', 'flash/error'); $this->redirect('/admin/items/index'); } $item = $this->Item->findById($id); $conditions = array( 'id' => $id, 'maker_id' => $this->auth['maker_id'], ); if($item){ if($this->Item->delete($conditions)){ $this->Session->setFlash(sprintf("【%s】を削除しました。", h($item['Item']['name'])), 'flash/delete'); }else{ $this->Session->setFlash('該当商品が見つかりません。', 'flash/error'); } }else{ } $this->redirect('/admin/items/index'); }
▼IDが正常に渡されているか判別します。このへんは適当に打たれ場合の対応ですね。
if(!($id && is_numeric($id))){ $this->Session->setFlash('対象IDが存在しません。', 'flash/error'); $this->redirect('/admin/items/index'); }
▼商品の情報を取得
対象の商品が存在するか?削除して良い商品なのか?を判断するために商品情報を一端、取得為ておきます。
$item = $this->Item->findById($id);
▼削除条件の作成
IDや削除対象として良いかを判断。
※IDを直接渡していますが、ハッシュキーやトークンにしておくと少し安全になります。
※今回maker_idとしましたが、 IN条件の場合に空の変数を渡してしまうと、条件無しとなり全てが対象となるので注意!!
$conditions = array( 'id' => $id, 'maker_id' => $this->auth['maker_id'], );
▼削除処理
存在する商品の削除処理を行います。あとは、商品があるかどうか?正常に削除できたか?の判定があればOKですね。
if($item){ if($this->Item->delete($conditions)){ $this->Session->setFlash(sprintf("【%s】を削除しました。", h($item['Item']['name'])), 'flash/delete'); }else{ $this->Session->setFlash('商品の削除に失敗しました。', 'flash/error'); } }else{ $this->Session->setFlash('該当商品が見つかりません。', 'flash/error'); }
ボタンを押して商品を削除するだけですが、気をつけないといけないポイントは沢山有ります。
今回紹介したのは、削除のプログラムだけですが、HTMLでJSを使って制御したり、もっと細かい判定をいれたりすることもあります。
いろんな場面を想定して、不具合の少ないシステム構築ができると良いですよね。
※cakephpのbakeで作られる削除リンクはjavascriptの確認ダイアログは表示されますが、ツールで追われた場合、リンクをたどってデータが削除される場合があります。post処理に変更するほうが安全かもしれません。