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

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

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

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

CodeIgniter

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

解決済

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

qwe001
qwe001

総合スコア129

PHP

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

CodeIgniter

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

1回答

0リアクション

0クリップ

699閲覧

投稿2020/06/24 02:19

CodeIgniter3を使って管理画面を開発中です。
一覧画面で、チェックボックスで選択したマスタデータを一括削除することができます。

今回私がやりたいことは、
削除しようとしたマスタデータのいずれかが、どこかの記事で使用している場合、
削除処理を中断して、どの記事で使用しているかエラーメッセージを表示したいということです。

単体削除だと、次のコードでうまくいきました。(関係のないコードは省略しています)

Controller

php

public function validationBeforeListUpdateDelete() { $this->form_validation->set_rules('bulk_update_ids[]', "選択記事", 'callback_validationDependencies'); if(! $this->form_validation->run()){ return $this->redirectBackWithInput(); // 一覧画面にエラーメッセージを持って遷移 } } /** * 単体削除で実行した場合、$valには"dummy"が入る * 一括削除で実行した場合、$valには現在ループ中のIDが文字列型で入る */ public function validationDependencies($val) { if($val !== "dummy"){ // 一括削除の場合 $this->item_id = (int) $val; } $validationName = 'validationDependencies'; $entryGroups = $this->getDependentEntryGroups(); // 依存する記事の存在チェックし配列で返す e.g. ['topics' => ['1', '3'], 'tags' => []] if(! empty(array_filter($entryGroups))){ // 配列内の要素のいずれかが空でない時 $validationMessage = "このマスタデータを削除するためには、予め、以下の記事との紐づけを<strong>全て</strong>解除する必要があります"; foreach($entryGroups as $entryGroupName => $entryIds){ if(count($entryIds) > 0){ $entryGroupLabel = $this->$entryGroupName->transClassName; $validationMessage .= "<br>" . $entryGroupLabel . " 記事: "; // e.g. "トピックス管理 記事: " $anchors = array(); foreach($entryIds as $entryId){ $anchors[] = '<a href="' . base_url('admin/' . $entryGroupName . '/edit/' . $entryId) . '" target="_blank">' . $entryId . '</a>'; } $validationMessage .= implode(', ', $anchors); } } $this->form_validation->set_message($validationName, $validationMessage); return FALSE; // TODO ここでFALSEを返すので配列型のバリデーションが一つエラーになった時点で終了してしまう } return TRUE; }

View

一覧画面

html

<div>{{ form_error['bulk_update_ids[]'] | raw }}</div> <form action="bulk_update_delete" method="post"> <input type="checkbox" name="bulk_update_ids[]" value="1"> <input type="submit" value="一括削除"> </form>

一覧画面(エラー出力後イメージ)

html

<div> このマスタデータを削除するためには、予め、以下の記事との紐づけを<strong>全て</strong>解除する必要があります <br>トピックス管理 記事: <a href="/cms/public/admin/topics/edit/1" target="_blank">1</a> <a href="/cms/public/admin/topics/edit/3" target="_blank">3</a> </div> <form action="bulk_update_delete" method="post"> <input type="checkbox" name="bulk_update_ids[]" value="1"> <input type="submit" value="一括削除"> </form>

ですが、一括削除だと複数のマスタデータを削除することになります。
もし、それぞれのマスタデータをいずれかの記事で使用している場合、
上記コードだと最初の1件目のエラーでバリデーションが終了してしまうため、
2件目以降のマスタデータがいずれかの記事で使用しているかを知ることができません。

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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

CodeIgniter

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