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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

6920閲覧

Cakephp3でバリテーション

yajin

総合スコア75

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/06/27 04:50

###前提・実現したいこと
CakePHP3でユーザ仮登録のバリテーションをかけようと思っています。
フォームに正しくない値を挿入すると、リダイレクトはされずにいますが、エラーメッセージが表示されません。

###発生している問題・エラーメッセージ
エラーメッセージが表示されない。
一度、登録ボタンを押すとソースが表示されなくなる。(chrome)

###該当のソースコード

UsersTable.php public function validationDefault(Validator $validator) { $validator ->notEmpty('email', 'メールアドレスが入力されていません。') ->notEmpty('password', 'パスワードが入力されていません。') ->notEmpty('username', 'ニックネームが入力されていません。') ->add('password',[ 'length'=> [ 'rule' => ['minLength', 8], 'message' => 'パスワードは8文字以上で設定してください。' ] ]); return $validator; }
<?= $this->Form->create('user',['class' => 'register_form']); ?> <?= $this->Form->input('email',['label' => 'メールアドレス','placeholder' => 'メールアドレス']); ?> <?= $this->Form->hidden('ukey',['value' => strtr(substr(base64_encode(openssl_random_pseudo_bytes(32)),0,32),'/+','_-')]); ?> <?= $this->Form->input('password',['label' => 'パスワード','placeholder' => 'パスワード']); ?> <?= $this->Form->input('username',['label' => 'ユーザ名','placeholder' => 'ユーザ名']); ?> <?= $this->Form->button('登録'); ?> <?= $this->Form->end(); ?>

###試したこと
そもそもctpファイルに出力するためにどのように書けばよいのでしょうか。

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

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

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

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

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

yajin

2016/06/29 15:09

はい。参照しました。inputで書いています。
guest

回答1

0

ベストアンサー

状況が、あまり把握できていませんが、ModelのValidatorにnotEmptyの条件を追加することで、FormヘルパーによるInput生成の際に、HTMLのrequired属性が設定されてしまのが原因のように思います
required属性が設定されると、ブラウザ側で未入力のチェックが行われ、自分の環境(Chrome)では「このフィールドを入力してください」とポップアップのようなメッセージが表示されます

このrequired属性が自動で設定されてしまうのは、以下のようにFormヘルパーのinputメソッドのオプションで、requiredをFalse設定することにより回避できます
このとき、対象フィールドは未入力のままPOSTされますので、、サーバ側のバリデーションで未入力を検出し、設定したメッセージを表示することが可能になります

CakePHP

1 <?= $this->Form->input('password',['required' => false,'label' => 'パスワード','placeholder' => 'パスワード']); ?>

【追記2016/07/01】
自分の環境は、テーブルを作成してcontroller,model,templateをbakeしたのち、バリデーションの条件のみを追加していますが、問題なくエラーメッセージが表示されます
自分の環境のコード(といってもほとんどbakeしたままですが)を添付しますので、ご自身のコードとの差分等をご確認ください

CakePHP

1コントローラー 2/** 3 * Samples Controller 4 * 5 * @property \App\Model\Table\SamplesTable $Samples 6 */ 7class SamplesController extends AppController 8{ 9 10 /** 11 * Add method 12 * 13 * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. 14 */ 15 public function add() 16 { 17 $sample = $this->Samples->newEntity(); 18 if ($this->request->is('post')) { 19 $sample = $this->Samples->patchEntity($sample, $this->request->data); 20 if ($this->Samples->save($sample)) { 21 $this->Flash->success(__('The sample has been saved.')); 22 return $this->redirect(['action' => 'index']); 23 } else { 24 $this->Flash->error(__('The sample could not be saved. Please, try again.')); 25 } 26 } 27 $this->set(compact('sample')); 28 $this->set('_serialize', ['sample']); 29 } 30} 31 32モデル 33/** 34 * Samples Model 35 * 36 */ 37class SamplesTable extends Table 38{ 39 40 /** 41 * Initialize method 42 * 43 * @param array $config The configuration for the Table. 44 * @return void 45 */ 46 public function initialize(array $config) 47 { 48 parent::initialize($config); 49 50 $this->table('samples'); 51 $this->displayField('name'); 52 $this->primaryKey('id'); 53 54 $this->addBehavior('Timestamp'); 55 } 56 57 /** 58 * Default validation rules. 59 * 60 * @param \Cake\Validation\Validator $validator Validator instance. 61 * @return \Cake\Validation\Validator 62 */ 63 public function validationDefault(Validator $validator) 64 { 65 $validator 66 ->integer('id') 67 ->allowEmpty('id', 'create'); 68 $validator 69 ->notEmpty('name', '名前を入力してください') 70 ->notEmpty('comment','コメントを入力してください') 71 ->add('comment',['length'=> ['rule' => ['minLength', 8],'message' => 'コメントは8文字以上で設定してください']]); 72 73 return $validator; 74 } 75} 76 77テンプレート(addのみ) 78<nav class="large-3 medium-4 columns" id="actions-sidebar"> 79 <ul class="side-nav"> 80 <li class="heading"><?= __('Actions') ?></li> 81 <li><?= $this->Html->link(__('List Samples'), ['action' => 'index']) ?></li> 82 </ul> 83</nav> 84<div class="samples form large-9 medium-8 columns content"> 85 <?= $this->Form->create($sample) ?> 86 <fieldset> 87 <legend><?= __('Add Sample') ?></legend> 88 <?php 89 echo $this->Form->input('name',['required' => false, 'label' => '名前','placeholder' => '名前']); 90 echo $this->Form->input('comment',['required' => false, 'label' => 'コメント', 'placeholder' => 'コメント']); 91 ?> 92 </fieldset> 93 <?= $this->Form->button(__('Submit')) ?> 94 <?= $this->Form->end() ?> 95</div>

【追記】
画面のHTMLソース

HTML

1<div class="samples form large-9 medium-8 columns content"> 2 <form method="post" accept-charset="utf-8" action="/cakephp30/samples/add"> 3 <div style="display:none;"> 4 <input type="hidden" name="_method" value="POST"/> 5 </div> 6 <fieldset> 7 <legend>Add Sample</legend> 8 <div class="input text required"> 9 <label for="name">Name</label> 10 <input type="text" name="name" required="required" maxlength="45" id="name"/> 11 </div> 12 <div class="input text"> 13 <label for="comment">Comment</label> 14 <input type="text" name="comment" maxlength="45" id="comment"/> 15 </div> 16 </fieldset> 17 <button type="submit">Submit</button> 18 </form> 19</div>

投稿2016/06/30 07:50

編集2016/07/01 07:15
KatsumiTanaka

総合スコア924

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

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

yajin

2016/06/30 13:47

ご返信ありがとうございます。 上記の提案試してみましたが、解決できませんでした。 何かその他に必要な情報ありますでしょうか。 ご返信宜しくお願い致します。
KatsumiTanaka

2016/07/01 00:46

現状は、どのような動作になっているのでしょうか? 自分の環境では上記したように、inputタグにrequired属性が設定されているため、ブラウザが必須入力のチェックを行っていました また、対象画面のHTMLのソースコードでは、どのような表示になっているのでしょうか?
yajin

2016/07/01 04:04

operaで見たところ次のようなエラーメッセージがあらわれました。 Confirm form resubmission This webpage requires data that you entered earlier in order to be properly displayed. You can send this data again, but by doing so you will repeat any action this page previously performed. Press Reload to resend that data and display this page. ページの読み込みに必要なデータを再送信するには、再読み込みボタンを押してください。
yajin

2016/07/01 04:08 編集

HTML上のソース <div class="register_form"> <form method="post" accept-charset="utf-8" class="register_form" action="/users/register"><div style="display:none;"><input type="hidden" name="_method" value="POST"/><input type="hidden" name="_csrfToken" value="d4f31f80912c6e733062f2f91112c8bbcbf5c1aaa9b95f5497bc5afa1536d58d5dc3ee4eb452d366852ce8afcb5c9e9e33a6f527886fa27ae9f5c6afcc4078cf"/></div> <div class="input email"><label for="email">メールアドレス</label><input type="email" name="email" placeholder="メールアドレス" id="email" value=""/></div> <input type="hidden" name="ukey" value="1oYfms9o9O1bZCzcanOikeI4g_n2KA0H"/> <div class="input password"><label for="password">パスワード(8文字以上の英数字特殊文字)</label><input type="password" name="password" placeholder="パスワード" id="password" value=""/></div> <div class="input text"><label for="username">ユーザ名</label><input type="text" name="username" placeholder="ユーザ名" id="username" value=""/></div> <button type="submit">β版に同意して登録</button> </form> </div>
yajin

2016/07/01 04:11

モデル namespace App\Model\Table; use Cake\ORM\Table; use Cake\Validation\Validator; class UsersTable extends Table{ public function initialize(array $config) { $this->addBehavior('Timestamp'); } public function validationDefault(Validator $validator) { $validator ->notEmpty('email', 'メールアドレスが入力されていません。') ->notEmpty('password', 'パスワードが入力されていません。') ->notEmpty('username', 'ニックネームが入力されていません。') ->add('password',[ 'length'=> [ 'rule' => ['minLength', 8], 'message' => 'パスワードは8文字以上で設定してください。' ] ]); return $validator; } }
KatsumiTanaka

2016/07/01 05:39

ソースを提示するための、元コメントに追記しましたので、ご確認ください
yajin

2016/07/01 07:02

ご返信ありがとうございました。 flashヘルパーの表示部分を記載してなかったので、記載したところ、確かにflashヘルパー(全体的なエラー表示)はできるようになったのですが、個別のエラー表示ができません。 HTML文法チェックをしてみても、エラーはなく、タグの構造的にもあっていると考えられます。 依然、登録はされないものの、個別のエラーメッセージはでてこず、ソースを確認しても「フォーム再送信の確認」と出てきます。
yajin

2016/07/01 07:05

フォームヘルパーで、送信前のソースを確認すると、 <div style="display:none;">がタグとしてはかれてるのですが、これが原因でしょうか? これを無効にできる方法はありますでしょうか?
KatsumiTanaka

2016/07/01 07:16

元コメントに自分の環境のHTMLソースを追記しましたが、 <div style="display:none;"> は、同じように出力されているので、問題ないと思います
yajin

2016/07/01 08:59

色々といじっていたら解決できました。 formヘルパーの第一引数を$userにして、$this->Form->error('Model.email)などと設定したところ、表示されるようになりました。 ありがとうございます。
KatsumiTanaka

2016/07/01 09:03

解決できてよかったです(・∀・)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問