2013-08-19 49 views
0

還發布unsuccesfully淘谷歌和SO的關於與模型驗證問題的sollution,我決定發佈自己的問題後。有些東西告訴我這個問題很小,所以請原諒我的失明。Yii的模型驗證工作的,形式沒有錯誤

問題: 我有一個登記表,其中包括它們一起需要驗證爲18歲的最小年齡的字段daymonthyear

問題是,方法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."]} 

這意味着驗證被解僱時,用戶卻沒有收到任何錯誤,也沒有被公佈停止形式。

我丟在這裏,任何幫助,將不勝感激。

+0

哪裏是你的控制器代碼? –

+0

更新了原來的問題。 – deacs

+0

返回true或false沒有區別,請參閱Pitchinnate的答案 – deacs

回答

2

你是對不需要真的還是假的了的回報。但我認爲這個問題可能與你的html中的選擇框有關。我相信你需要正確的有編號的設置:

<select name="SignUpForm[day]" id="SignUpForm_day" class="day"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
</select> 

它通常是更好地使用內置的從CHTML形式生成器,這樣你就不會遇到這樣的問題。例如:

$options = array(1,2,3,4,5,6); 
echo $form->dropDownList($model,'day',$options); 

$options = array(1=>'jan',2=>'feb',3='mar'); 
echo $form->dropDownList($model,'month',$options); 
+0

這並不能解決問題(我不認爲你需要返回true或false)。驗證方法'checkEmail()'不返回true或false,並且該方法的工作方式與它應該的相同。 – deacs

+0

你是對的,因爲這是不再需要看到我更新的答案我相信這個問題是與您的HTML ID。 – Pitchinnate

+0

你是絕對正確的,那時,我接着說:ID =「SignUpForm_day」'我的HTML選擇元素,問題就解決了 - 就像它應該被顯示我的錯誤。非常感謝,感謝您使用CHtml生成dropDownList的提示,未來肯定會這樣做。 – deacs