cakephp1.2のバリデーションについて質問です。


フォームから入力された値に対して、空白チェックしたいと思います。
この項目はDB登録・更新しないので、テーブル定義されていません。
※ある値を計算するために必要な項目(数字)となります。

どのようにバリデーションすれば良いのでしょうか?
(サーバ側の話です。)

私の認識ですと、テーブル定義されていないので、modelのvalidatesは使えないと思っています。

何か良い方法をアドバイスしてください!
また、そういうことが書かれているURLがあれば教えてください。
よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/10/06 10:41:31
  • 終了:2008/10/07 16:46:44

ベストアンサー

id:zero-uhura No.2

zero-uhura回答回数14ベストアンサー獲得回数32008/10/06 16:43:43

ポイント35pt

modelに書いてある「email」「body」は、どこで定義されているものでしょうか?

DB登録しないので、モデルで定義を行えば十分かと思います(あなたが思う定義を行えばよいです、名前とかバリデーションとか)。


また、コントローラでemptyを使っているところも、少し違うような気がします。

それでは、フレームワークの良さも半減なような。

これは、バリデーションを行っているのではなく、フォームの初期状態を表示するか、送信データで処理を行うかの判断を行っています(送信データがあれば処理を行い、なければフォームの初期状態を表示)。

なお、このロジックは「./cake/console/cake bake」での生成コードでも利用されています。



1.2系で試してみました、足し算するだけの見本

下記のMVCを用意して以下のURLにアクセスしてみてください。

http://あなたの用意したドメイン[/サブディレクトリがあればそのディレクトリ]/calcs/sum

モデル (.../app/models/calc.php)
<?php
class Calc extends AppModel {

	var $name = 'Calc';
	var $validate = array(
		'num_a' => array(
			'rule' => 'numeric',
			'message' => '数値をいれてね',
		),
		'num_b' => array(
			'rule' => 'numeric',
			'message' => '数値をいれてね',
		),
	);
	var $useTable = false; // テーブル定義なし

	var $ans; // 計算結果
	
	function sum ($data = null) {
		// バリデーション
		if(!$this->validates()) return false;
		
		$this->ans = $data['Calc']['num_a'] + $data['Calc']['num_b'];
		return true;
	}

}
?>

コントローラ (.../app/controllers/calcs_controller.php)
<?php
class CalcsController extends AppController {

	var $name = 'Calcs';
	var $helpers = array('Html', 'Form');

	function sum() {
		if (!empty($this->data)) {
			$this->Calc->set( $this->data );
			if ($this->Calc->sum($this->data)) {
				$this->Session->setFlash('計算しますた、回答は「' . $this->Calc->ans . '');
				$this->redirect(array('action'=>'sum'));
			} else {
				$this->Session->setFlash('入力に誤りがあります');
			}
		}
	}

	function index() {
		echo 'test';
		exit;
	}

}
?>

ビュー (/app/views/calcs/sum.ctp)
<?php echo $form->create('Calc', array('action' => 'sum'));?>
	<fieldset>
 		<legend><?php __('Calc');?></legend>
	<?php
		echo $form->input('num_a');
		echo $form->input('num_b');
	?>
	</fieldset>
<?php echo $form->end('Submit');?>

http://q.hatena.ne.jp/ (またまた、URLはダミーです。)

その他の回答(1件)

id:zero-uhura No.1

zero-uhura回答回数14ベストアンサー獲得回数32008/10/06 11:16:24

ポイント35pt

1.1系での話しで恐縮です(ポイントは結構です)、参考になればと思います。

モデルで設定することも可能です、こうすると他のテーブル定義ありと同じフローでプログラミングできます。

モデル

<?php
class Inquiry extends AppModel {

	var $name = 'Inquiry';
	var $validate = array(
		'email' => VALID_NOT_EMPTY,
		'body' => VALID_NOT_EMPTY,
	);
	var $useTable = false; // テーブル定義なし
}
?>

コントローラ

<?php
class InquiryController extends AppController {

	var $name = 'Inquiry';
	var $helpers = array('Html', 'Form',);
	var $uses = array ('Inquiry',);
	
	function inquiry () {
		if (!empty($this->data)) {
			if($this->Inquiry->validates($this->data)){
				// 保存に変わる何らかの処理(メール送信とか)
			} else {
				$this->Session->setFlash('登録内容に誤りがあります。');
			}
		}
	}

}
?>

http://q.hatena.ne.jp/ (URLはダミーです。)

id:jojo_oraora

これではできないと思います。

modelに書いてある「email」「body」は、どこで定義されているものでしょうか?

通常、テーブル定義の部分ですよね。

また、コントローラでemptyを使っているところも、少し違うような気がします。

それでは、フレームワークの良さも半減なような。

2008/10/06 14:57:48
id:zero-uhura No.2

zero-uhura回答回数14ベストアンサー獲得回数32008/10/06 16:43:43ここでベストアンサー

ポイント35pt

modelに書いてある「email」「body」は、どこで定義されているものでしょうか?

DB登録しないので、モデルで定義を行えば十分かと思います(あなたが思う定義を行えばよいです、名前とかバリデーションとか)。


また、コントローラでemptyを使っているところも、少し違うような気がします。

それでは、フレームワークの良さも半減なような。

これは、バリデーションを行っているのではなく、フォームの初期状態を表示するか、送信データで処理を行うかの判断を行っています(送信データがあれば処理を行い、なければフォームの初期状態を表示)。

なお、このロジックは「./cake/console/cake bake」での生成コードでも利用されています。



1.2系で試してみました、足し算するだけの見本

下記のMVCを用意して以下のURLにアクセスしてみてください。

http://あなたの用意したドメイン[/サブディレクトリがあればそのディレクトリ]/calcs/sum

モデル (.../app/models/calc.php)
<?php
class Calc extends AppModel {

	var $name = 'Calc';
	var $validate = array(
		'num_a' => array(
			'rule' => 'numeric',
			'message' => '数値をいれてね',
		),
		'num_b' => array(
			'rule' => 'numeric',
			'message' => '数値をいれてね',
		),
	);
	var $useTable = false; // テーブル定義なし

	var $ans; // 計算結果
	
	function sum ($data = null) {
		// バリデーション
		if(!$this->validates()) return false;
		
		$this->ans = $data['Calc']['num_a'] + $data['Calc']['num_b'];
		return true;
	}

}
?>

コントローラ (.../app/controllers/calcs_controller.php)
<?php
class CalcsController extends AppController {

	var $name = 'Calcs';
	var $helpers = array('Html', 'Form');

	function sum() {
		if (!empty($this->data)) {
			$this->Calc->set( $this->data );
			if ($this->Calc->sum($this->data)) {
				$this->Session->setFlash('計算しますた、回答は「' . $this->Calc->ans . '');
				$this->redirect(array('action'=>'sum'));
			} else {
				$this->Session->setFlash('入力に誤りがあります');
			}
		}
	}

	function index() {
		echo 'test';
		exit;
	}

}
?>

ビュー (/app/views/calcs/sum.ctp)
<?php echo $form->create('Calc', array('action' => 'sum'));?>
	<fieldset>
 		<legend><?php __('Calc');?></legend>
	<?php
		echo $form->input('num_a');
		echo $form->input('num_b');
	?>
	</fieldset>
<?php echo $form->end('Submit');?>

http://q.hatena.ne.jp/ (またまた、URLはダミーです。)

  • id:zero-uhura
    すみません、前の質問(http://q.hatena.ne.jp/1223190144)を見返していて頭が整理できました!!

    DB・テーブルの利用はするものの、テーブルで定義されていないデータをどのように処理するかということですね?

    たとえば価格テーブルがあって、そこには「商品名」と「価格(税込み)」しかない
    しかし、入力側(フォーム)には「商品名」、「価格(本体)」、「価格(税)」があったら
    テーブルの「価格(税込み)」にはフォームからの(「価格(本体)」+「価格(税)」)を
    登録しないといけなくなるということですよね?

    違ってたら、すみません、もしそうであれば、時間があるときに日記に見本でも書いてみます。

    今回、ポイントは結構です ;)
  • id:jojo_oraora
    ご丁寧にありがとうございます。
    仕様としては、まさにそのような感じになります。

    アドバイスは理解しているのですが、
    コントローラで
    if(!$this->Inquiry->validates()){}
    としても、エラーとして引っかかってこないので、悩んでいるところです。

    $_schemaを使う方法を見つけましたが、ここで教えてもらったやり方の方がスマートだし簡単なので、
    もう少し格闘したいと思います。
  • id:zero-uhura
    1.2系では「$this->Inquiry->validates()」する前に「$this->Inquiry->set($this->data);」する必要があります。

    前回の例が1.1系でしたので混乱を招いてしまいましたね。

    上の例では、モデル側でチェックしています。
  • id:jojo_oraora
    解決しました!
    原因は、setの使い方と初期化のため直前のif文の括弧内で使っていたreturn;が悪さをしていました。

    zero-uhuraさんにアドバイスもらってなかったら、まだ迷っていたに違いありません。
    ありがとうございました。

    そして、私の勘違いも発覚しました。
    テーブルに定義していないと、そのmodelでバリデーションを行えないと質問文に書きましたが、原因は上記のように他にあったようです。
  • id:zero-uhura
    解決してよかったです、ほっ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません