CodeIgniter3を使って管理画面を開発中です。
一覧画面で、チェックボックスで選択したマスタデータを一括削除することができます。
今回私がやりたいことは、
削除しようとしたマスタデータのいずれかが、どこかの記事で使用している場合、
削除処理を中断して、どの記事で使用しているかエラーメッセージを表示したいということです。
単体削除だと、次のコードでうまくいきました。(関係のないコードは省略しています)
Controller
php
1 2 public function validationBeforeListUpdateDelete() 3 { 4 $this->form_validation->set_rules('bulk_update_ids[]', "選択記事", 'callback_validationDependencies'); 5 if(! $this->form_validation->run()){ 6 return $this->redirectBackWithInput(); // 一覧画面にエラーメッセージを持って遷移 7 } 8 } 9 10 /** 11 * 単体削除で実行した場合、$valには"dummy"が入る 12 * 一括削除で実行した場合、$valには現在ループ中のIDが文字列型で入る 13 */ 14 public function validationDependencies($val) 15 { 16 if($val !== "dummy"){ // 一括削除の場合 17 $this->item_id = (int) $val; 18 } 19 20 $validationName = 'validationDependencies'; 21 22 $entryGroups = $this->getDependentEntryGroups(); // 依存する記事の存在チェックし配列で返す e.g. ['topics' => ['1', '3'], 'tags' => []] 23 24 if(! empty(array_filter($entryGroups))){ // 配列内の要素のいずれかが空でない時 25 $validationMessage = "このマスタデータを削除するためには、予め、以下の記事との紐づけを<strong>全て</strong>解除する必要があります"; 26 27 foreach($entryGroups as $entryGroupName => $entryIds){ 28 29 if(count($entryIds) > 0){ 30 $entryGroupLabel = $this->$entryGroupName->transClassName; 31 $validationMessage .= "<br>" . $entryGroupLabel . " 記事: "; // e.g. "トピックス管理 記事: " 32 33 $anchors = array(); 34 foreach($entryIds as $entryId){ 35 $anchors[] = '<a href="' . base_url('admin/' . $entryGroupName . '/edit/' . $entryId) . '" target="_blank">' . $entryId . '</a>'; 36 } 37 38 $validationMessage .= implode(', ', $anchors); 39 } 40 } 41 42 $this->form_validation->set_message($validationName, $validationMessage); 43 44 return FALSE; // TODO ここでFALSEを返すので配列型のバリデーションが一つエラーになった時点で終了してしまう 45 } 46 47 return TRUE; 48 }
View
一覧画面
html
1 2<div>{{ form_error['bulk_update_ids[]'] | raw }}</div> 3 4<form action="bulk_update_delete" method="post"> 5 <input type="checkbox" name="bulk_update_ids[]" value="1"> 6 <input type="submit" value="一括削除"> 7</form>
一覧画面(エラー出力後イメージ)
html
1 2<div> 3このマスタデータを削除するためには、予め、以下の記事との紐づけを<strong>全て</strong>解除する必要があります 4<br>トピックス管理 記事: 5<a href="/cms/public/admin/topics/edit/1" target="_blank">1</a> 6<a href="/cms/public/admin/topics/edit/3" target="_blank">3</a> 7</div> 8 9<form action="bulk_update_delete" method="post"> 10 <input type="checkbox" name="bulk_update_ids[]" value="1"> 11 <input type="submit" value="一括削除"> 12</form>
ですが、一括削除だと複数のマスタデータを削除することになります。
もし、それぞれのマスタデータをいずれかの記事で使用している場合、
上記コードだと最初の1件目のエラーでバリデーションが終了してしまうため、
2件目以降のマスタデータがいずれかの記事で使用しているかを知ることができません。
どのようにすれば、配列型のバリデーションで全てのマスタデータのバリデーションを一度に表示できますか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。