還發布unsuccesfully淘谷歌和SO的關於與模型驗證問題的sollution,我決定發佈自己的問題後。有些東西告訴我這個問題很小,所以請原諒我的失明。Yii的模型驗證工作的,形式沒有錯誤
問題: 我有一個登記表,其中包括它們一起需要驗證爲18歲的最小年齡的字段day
month
和year
。
問題是,方法checkAge()
似乎是射擊並給出了一個響應(我使用Firebug Webdev工具中的Net響應進行了檢查),除了響應沒有顯示在<?php echo $form->error($model,'day'); ?>
佔位符中,驗證錯誤也沒有阻止表單被髮布。
我的其他自定義驗證方法checkEmail()
完美地工作,錯誤顯示爲預期(並顯然防止在發生錯誤時發佈窗體)。
型號:
class SignUpForm extends CFormModel
{
...
public $email;
public $day;
public $month;
public $year;
...
public function rules()
{
return array(
array('..., email, day, month, year, ...', 'required'),
....
array('email', 'checkEmail'),
array('day', 'checkAge'),
);
}
public function checkEmail()
{
$check = file_get_contents('...'); // api checks if email is in use - WORKS (!)
if ($check == 0)
$this->addError('email','Email is in use.');
}
public function checkAge()
{
$this->addError('day','Age must be atleast 18 years old.');
}
...
檢視:
<div class="form signupform" id="signupform">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'signup-form',
'enableAjaxValidation'=>true,
'clientOptions'=>array('validateOnSubmit'=>true),
'action' => array('site/signup')
)); ?>
...
<div class="row select">
<?php echo $form->labelEx($model,'day', array('class'=>'geb')); ?>
<select name="SignUpForm[day]" class="day">
<option value="1">1</option>
<option value="2">2</option>
...
</select>
<select name="SignUpForm[month]" class="month">
<option value="1">jan</option>
<option value="2">feb</option>
...
</select>
<select name="SignUpForm[year]" class="year">
<option value="1996">1996</option>
<option value="1995">1995</option>
...
</select>
<?php echo $form->error($model,'day'); ?>
</div>
...
控制器:
public function actionSignUp()
{
$model=new SignUpForm;
if(isset($_POST['ajax']) && $_POST['ajax']==='signup-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
if (isset($_POST['SignUpForm']))
{
$postFields = $_POST['SignUpForm'];
// posts to api via curl
$response= Yii::app()->curl->post('http://www.api.com/myapi.php', array(
...
'email' => $postFields['email'],
'day' => $postFields['day'],
'month' => $postFields['month'],
'year' => $postFields['year'],
...
));
// proces response
}
else
$this->render('register', array('model'=>$model));
}
從AJAX的響應(如在螢火蟲看到的):
{"SignUpForm_email":["E-mail is required.","Email is in use."],"SignUpForm_day":["Age must be atleast 18 years old."]}
這意味着驗證被解僱時,用戶卻沒有收到任何錯誤,也沒有被公佈停止形式。
我丟在這裏,任何幫助,將不勝感激。
哪裏是你的控制器代碼? –
更新了原來的問題。 – deacs
返回true或false沒有區別,請參閱Pitchinnate的答案 – deacs