エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因

   

CakePHP4で画面上部のフラッシュメッセージと入力ボックスに表示されるエラーメッセージ

 
Bakeで自動生成された Edit処理のソースを元に、少しだけ処理を追加したところ、入力エラーが発生しているのに、バリデーションのメッセージ(入力エラー)が表示されない、と言う不具合がありました。
 
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因のフォーム画像
 
上記の画像の「Flashメッセージ」は表示されるのですが、「バリデーションのメッセージ」が表示されないのです。
 
 
今回のこの不具合は、バリデーションエラー(入力チェックのエラー)は発生しているものの、正常な処理によるエラー処理のため(エラーログ等は出力されないため)、不具合の原因の特定に時間がかかったのですが、同じような不具合で悩んでいる方もあるのではないか、と思い記事を書きました。
 
原因は「エラーが発生しているときにリダイレクトしているため」でした。
 
 
この記事の内容は、CakePHP3、CakePHP4でも同じように処理できます。
 
ちなみに、フラッシュエラーに関しては下記にも記事を書いていますので、参考にしてください。
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
 
CakePHP3 フラッシュ(FlashComponent)
https://book.cakephp.org/3/ja/controllers/components/flash.html
 
CakePHP4 フラッシュ(FlashComponent)
https://book.cakephp.org/4/ja/controllers/components/flash.html
 
 

エラーが発生したときの処理でリダイレクトをしていませんか?

 
CakePHP4の入力フォームで、バリデーションエラー(入力エラー)がある場合、画面上部に表示される Flashのエラーメッセージは表示されるものの、入力エラーがある項目の下にエラーメッセージは表示されない、という不具合の一つの原因をご紹介します。
 
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因のフォーム画像
 
今回の記事は、上記の不具合の原因の一例のご紹介です。
プログラムの文法には不具合はないため、原因が分かりにくいものです。
 
 
不具合の原因は多種多様です。
ですが、この記事で紹介したような不具合もあるよ!これで解決する方が一人でもいれば!という感じで書いています。
 
 

Bakeで自動生成されるデフォルトのソースコードを元に解説

 
下記は Bakeで自動生成されたソースコードの一部です。
 

 
入力エラーが発生すると
$this->Flash->error(__('The topic could not be saved. Please, try again.'));
の処理が実行されます。
 
ここで処理されたメッセージは、レイアウト「/templates/layout/default.php」に記述されている
Flash->render() ?>
で処理されて表示されます。
 
あわせて、入力項目の
echo $this->Form->control('topics_date');
で処理されて、バリデーションエラー(入力エラー)のメッセージが入力項目の下に表示されます。
 
 

デフォルトのソースコードを元に改変したソースコード

 
今回の不具合は、デフォルトの処理を少し改変し、ログを保存する処理を追加して下記のような処理にしていました。
 
この場合、バリデーションエラー(入力エラー)があった場合、Flashのメッセージは表示されるのですが、入力項目ごとのエラーメッセージは表示されません。
 
どこが間違っているか分かりますか?
 

 
不具合の原因は、17行目の「return $this->redirect(['action' => 'edit', $id]);」の部分になります。
 
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因の処理の概要図
 
上記の処理では、バリデーションエラーが発生した場合は 17行目でリダイレクトをしていますので、表示されている画面は、入力をする前の状態の画面が再度表示されているだけですので、入力項目ごとのエラーメッセージは表示されません。
 
 
ですが、16行目の「$this->Flash->error(__($e->getMessage()));」で処理している Flashメッセージに関しては、リダイレクトをしてもメッセージを受け取って表示をしてくれるのです。
 
これはこれで便利な機能なんですが、今回のような不具合の原因につながるのです。
 
 
処理の内容を確認すれば当たり前と言えば当たり前なんですが、Flashのエラーメッセージは表示されているため、リダイレクトされていることに気づきにくいんですよね。
 
処理は正しく行われており、バリデーションのエラーメッセージが表示されていない、
という不具合だと誤認してしまうのです。
そうするとなかなか不具合の原因に行き当たらないわけです。
 
 
プログラムの不具合はないけれど、入力項目ごとのエラーメッセージが表示されない。
そんな不具合が発生したときに原因に気づくきっかけになれば、と思っています。
 
 

CakePHP4の関連記事

CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介

CakePHP4、5系の認証処理でログイン認証が通らない場合の確認方法、確認箇所を解説。ログ出力し、ステータスを確認するが、ステータスの内容も紹介。それはそのままusernameを変更する際のポイントでもある。

CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法

CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。

CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法

CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!

CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4から外部のデータベースにアクセスする方法解説

CakePHP4のシステムから他のシステムのデータベースにアクセスをし、SQL文を実行する方法を解説。try-catchでエラーを取得する方法も解説。

CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法

CakePHP3でPHPExcelを利用してエクセルを編集、出力するサンプルソース+解説。PHPExcelのインストール方法の解説からファイル保存とダウンロードの方法なども解説。

CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い

CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。

CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法

CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。

CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説

CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。

CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順

CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。