エス技研

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の関連記事

CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説

CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。

CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合

アソシエーション(連携)している先のテーブルの項目で条件抽出する際の考え方と注意点をサンプルソースを用いて説明しています。

CakePHP 2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で queryを使って日付の範囲検索の方法です。

Google Analytics APIを CakePHP3で動かしてレポートデータを取得する方法の解説
Google Analytics APIを CakePHP3で動かしてレポートデータを取得する方法の解説

CakePHP3で Google Analytics APIからレポートデータを取得する処理の解説。PHPのサンプルソースをCakePHP3で動くように改造。加えて、ディメンションやメトリックスを条件に設定する方法なども。

CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る

他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。

CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。

CakePHP3のバージョンを指定してインストールする詳細な手順を解説
CakePHP3、CakePHP4のバージョンを指定してインストールする詳細な手順を解説

CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。

CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする

CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。

CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座

CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。

CakePHP3のインストールでURL rewriting......のエラーが!その解決方法解説
CakePHP3のインストールでURL rewriting……のエラーが!その解決方法解説

CakePHP3をインストールしたら URL rewriting is not properly configured.のエラーが。原因は.htaccessが有効になっていないこと。httpd.confに設定を追加すればOK。