質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

1回答

1505閲覧

CodeIgniter3で配列型のエラーメッセージをまとめて表示したい

qwe001

総合スコア133

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

0クリップ

投稿2020/06/24 02:19

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件目以降のマスタデータがいずれかの記事で使用しているかを知ることができません。

どのようにすれば、配列型のバリデーションで全てのマスタデータのバリデーションを一度に表示できますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

こちら自己解決しました。
結論から言うと、POST値を参照することで期待した通りに動きました。

$this->input->post('bulk_update_ids[]');

以下に、ソースコードを掲載します。

public function validationBeforeListUpdateDelete() { $this->form_validation->set_rules('bulk_update_ids[]', "選択記事", 'callback_validationBulkDependencies'); if(! $this->form_validation->run()){ return $this->redirectBackWithInput(); // 一覧画面にエラーメッセージを持って遷移 } } /** * 一括削除用のバリデーションコールバック * $valには現在ループ中のIDが入る(使わない) * $valを使う方法だと、最初にエラーが出た時点でバリデーション処理が終了し、 * 全部の依存エラーを確認できない * ので、POST値に入ってる配列値を使用することで、 * 全ての値の検査が完了するまで処理結果を待つことにした */ public function validationBulkDependencies($val) { $isErrored = FALSE; $targetIds = $this->input->post('bulk_update_ids[]'); if(count($targetIds) === 0){ return TRUE; } $msgHead = "削除処理を中止しました。予め、以下の記事との紐づけを<strong>全て</strong>解除するまで一括削除は実行されません"; $msgBody = ""; foreach($targetIds as $targetId){ $this->item_id = (int) $targetId; $entryGroups = $this->getDependentEntryGroups(); // 依存する記事の存在チェック if(! empty(array_filter($entryGroups))){ // 配列内の要素のいずれかが空でない時(依存する記事がある時) $isErrored = TRUE; $myAnchor = '<a href="' . base_url('admin/' . $this->currentClassName() . '/edit/' . $targetId) . '" target="_blank">' . $targetId . '</a>'; $dependFromMsg = "<br>" . $this->transClassName . " 記事: " . $myAnchor; foreach($entryGroups as $entryGroupName => $entryIds){ $dependToMsg = ""; if(count($entryIds) > 0){ $entryGroupLabel = $this->$entryGroupName->transClassName; $dependToMsg .= $entryGroupLabel . " 記事: "; $anchors = array(); foreach($entryIds as $entryId){ $anchors[] = '<a href="' . base_url('admin/' . $entryGroupName . '/edit/' . $entryId) . '" target="_blank">' . $entryId . '</a>'; } $dependToMsg .= implode(', ', $anchors); } $msgBody .= $dependFromMsg . " -> " . $dependToMsg; } } } if($isErrored){ $validationName = 'validationBulkDependencies'; $validationMessage = $msgHead . $msgBody; $this->form_validation->set_message($validationName, $validationMessage); return FALSE; } else { return TRUE; } }

投稿2020/06/29 03:53

qwe001

総合スコア133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問