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

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

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

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

CakePHP

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

Q&A

解決済

4回答

3050閲覧

cakephp2 同一ページに同名のinput textが2つ以上ある(別のForm)場合のバリデーションについて

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2016/08/15 14:55

編集2016/08/16 03:31

タイトルの通りですが、一つのFormでSubmitした際、まったく別のFormでもバリデーションが反応してしまって困っています。例えば記事投稿ページのPost.titleというフィールドと、全ページ共通部分のタイトル検索フィールドPost.titleなどは同一ページ上に存在します。
これを回避する手段はあるでしょうか?お手数ですがご教授頂ければ幸いです。

<追記>
ありがとうございます。
addページでtitleがnullの状態で、Submitするとaddページ、検索フォームともに”このフィールドは入力必須です”のメッセージが出力されてしまう状態です。
actionが異なっているのにバリデーションが反応してしまうこと自体がおかしいのでしょうか?
searchはsearch pluginを使用しています。
お二人に教えていただいた内容も試してみましたが、うまく設定できていないのか機能してくれません。。

posts/add (新規記事投稿)
posts/search (記事タイトル検索)

Post.php <Model>

public $actsAs = array('Search.Searchable'); public $validate = array( 'title' => array( 'rule' => 'notBlank', 'message' => 'このフィールドは入力必須です。' ) ); public $filterArgs = array( array('name' => 'title', 'type' => 'like') }

PostsController.php

public function add() { $this->loadModel('Category', 'Tag'); // add to categories table $this->set('posts', $this->Category->find('list', array('fields' => 'Category.name'))); // tag $this->set('tag', $this->Tag->find('list')); if ($this->request->is('post')) { $this->request->data['Post']['user_id'] = $this->Auth->user('id'); #$this->Post->create(); if ($this->Post->saveAll($this->request->data)) { $this->Session->setFlash(__('Your post has been saved.'), 'alert', array( 'plugin' => 'BoostCake', 'class' => 'alert-success' )); return $this->redirect(array('action' => 'index')); } // tagが2つ以上選択されていない場合のエラーメッセージを取得 $errors = $this->Post->validationErrors; if (!empty($errors)) $this->set('tag_error', $errors['Tag']); $this->Session->setFlash(__('Unable to add your post.'), 'alert', array( 'plugin' => 'BoostCake', 'class' => 'alert-danger' )); } } public function search() { #$this->Post->recursive = 2; $this->Prg->commonProcess(); $conditions = $this->Post->parseCriteria($this->Prg->parsedParams()); if (!empty($conditions)) { $this->set('posts', $this->paginate(array( $conditions )) ); } }

sidebar.ctp(search)

<?php echo $this->Form->create('Post', array( 'novalidate' => true, 'url' => array_merge(array('action' => 'search'), $this->params['pass']) )); echo $this->Form->input('Post.title', array('div' => 'form-group', 'class' => 'form-control')); echo $this->Form->end(); ?>

add.ctp(create)

<?php echo $this->Form->create('Post', array('type' => 'file', 'novalidate' => true)); echo $this->Form->input('title', array('class' => 'form-control', 'div' => 'form-group')); echo $this->Form->input('body', array('rows' => '3', 'class' => 'form-control', 'div' => 'form-group')); echo $this->Form->input('category_id', array( 'type' => 'select', 'div' => 'form-group', 'class' => 'form-control', 'options' => $posts)); echo $this->Form->input('Tag', array( 'div' => 'checkbox_wrap', 'type' => 'select', 'multiple' => 'checkbox', 'options' => $tag )); if (!empty($tag_error)) { echo '<div class="error-message tagerr">'; echo $tag_error[0]; echo '</div>'; } ?>

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

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

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

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

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

guest

回答4

0

CakePHPのvalidationは、それが検索ボックスとして機能しているのか投稿用として機能しているのか等は判断出来ません。
が、その要素が「update」なのか「create」なのかという事に置いては、validationを区別する事が出来ます。
http://book.cakephp.org/2.0/ja/models/data-validation.html#on

validation ruleに

php

1'on' => 'update'

と記述すれば、データの更新時のみそのルールが適用されます。
(同様に、createを指定すれば新規登録時のみのルールとなります)
今回は、投稿時にはcreate, 検索時にはselect(find) となりますので、検索時には動作しないルールが作成できるはずです。

ただ、検索用のFormと投稿用のFormは、そもそも飛び先(action)が異なるはずだと思います。
であれば、検索時にはvalidationしなければいいとも思いますが、なぜに検索時にvalidationが動くのでしょうか。

php

1$conditions = ['title' => $this->request->data('Post.title')]; 2$this->Post->find('all', $conditions);

のように、単純にfindしているだけであればvalidationは動かないはずですが。。

もし何等か$this->Post->save() する必要があるのであれば、検索のときにはvalidationをしない指定をする事も可能です。

php

1$this->Post->saveAll($this->request->data, ['validate' => false]);

http://book.cakephp.org/2.0/ja/models/data-validation/validating-data-from-the-controller.html

この内容で対応出来ないようであれば、FormのHTMLと、Controller, Modelのソースコードを提示して改めて状況説明下さい。

投稿2016/08/16 02:30

kunai

総合スコア5405

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

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

0

ベストアンサー

filterArgsにfieldを設定することで解決です。ありがとうございました。

投稿2016/08/18 01:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

アクションごとにモデルを作成してみてはいかがでしょうか?
コントローラーから使用するモデルを指定できます。
$this->loadModel(‘ModelName’);

投稿2016/08/16 10:41

takeshi556

総合スコア90

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

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

0

検索フォームと更新フォームを別々にするか検索用項目の接頭辞に sarch_ など付与してください

追記

php

1# 検索用モデル(Prefix:Search) 2class SearchPost extends Post { 3 public $useTable = false; 4 public $validate = array( 5 # 独自のvalidate 6 );}

php

1# コントローラーへの指定は割愛しています。 2echo $this->Form->input('SearchPost.title');

とするか

php

1if ($mode=='SEARCH' && $this->Post->validates(array( 2 # 独自のvalidate 3))) { 4 // バリデーションOK (検索) 5} else if ($this->Post->validates()) { 6 // バリデーションOK (登録) 7} else { 8 // バリデーションNG 9}

とするくらいでしょうか

投稿2016/08/15 15:55

編集2016/08/16 00:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/08/15 23:25

ありがとうございます。 検索フォームと投稿フォームは別のフォームですが、同一ページ上に存在します。(検索フォームは全ページ共通のため) 接頭辞に_search付与とは以下のようなことでしょうか? テーブルのカラム名と一致させる必要があるのではないでしょうか? echo $this->Form->input('Post.search_title'); よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問