2012-09-27 67 views
1

我使用Yii框架來創建一個非常簡單的1文本區域字段和2個隱藏的輸入,其中包含從服務器發送的預定義值。無限循環試圖驗證/保存

它應該工作的方式是預期,我的意思是,你寫在文本區域的東西,你點擊發送按鈕。進行ajax驗證(只對文本區域必須是不應該爲空的),如果驗證,則保存數據並重定向到其他頁面。

問題是,如果驗證錯誤被觸發,它不會保存任何數據。

我的意思是,如果我進入頁面,寫一些東西,然後點擊發送按鈕,數據將被保存,我將被正確重定向。但是如果我進入頁面,按發送按鈕(無需在文本區域中輸入任何內容),等待出現錯誤(請注意,這是通過ajax完成的,所以在這裏沒有頁面重新加載),寫一些東西並點擊再次發送 Yii將在無限循環中的請求之後開始發出請求。

我已經檢查了正在發送的數據,並且一切正常(數據和動作url)。

這裏是我的控制器代碼

public function actionView($id) 
{ 

    $user = Usuario::model()->findByAttributes(
     array(
      'nick'=>Yii::app()->user->getId() 
     ) 
    ); 

    $dataProvider=new CActiveDataProvider('Mensaje', array(
     'criteria'=>array(
      'with'=>array('usuario', 'usuario.detallesusuario'), 
      'condition'=>'Tema_idtema='.$id 
     ), 
     'pagination'=>array(
      'pageSize'=>1000, 
     ), 
    )); 

    $this->render('view',array(
     'model'=>$this->loadModel($id), 
     'usuario_id'=>$user->idusuario, 
     'tema_id'=>$id, 
     'dataProvider'=>$dataProvider, 
    )); 

} 

public function actionCreateMessage(){ 

    $model=new Mensaje; 

    $this->performAjaxValidation($model); 

    if(isset($_POST['Mensaje'])) 
    { 

     $model->attributes=$_POST['Mensaje']; 
     $model->fecha_hora=new CDbExpression('NOW()'); 

     $model->save(); 

     $this->redirect(array('view', 'id'=>$model->Tema_idtema)); 
    } 

} 

,在View

<?php 

$model = new Mensaje(); 
echo $this->renderPartial('_mensaje_form', array(
     'model'=>$model, 
     'usuario_id'=>$usuario_id, 
     'tema_id'=>$tema_id, 
    ), 
    false, //return instead of echo 
    true //post-process 
); 

?> 

這裏是 「_mensaje_form」 代碼

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'mensaje-form', 
    'action'=>CHtml::normalizeUrl(array('tema/createMessage')), 
    'enableAjaxValidation'=>true, 
    'clientOptions'=>array(
     'validateOnSubmit'=>true, 
     'validateOnChange'=>false, 
     'validateOnType'=>false, 
    ), 
)); ?> 

<?php echo $form->errorSummary($model); ?> 

<div class="row" style="margin:20px 5px 0 176px;"> 
    <?php echo $form->labelEx($model,'mensaje'); ?> 
    <?php echo $form->textArea($model,'mensaje',array('rows'=>6, 'cols'=>50)); ?> 
    <?php echo $form->error($model,'mensaje'); ?> 

    <?php echo $form->hiddenField($model, 'Tema_idtema', array('value'=>$tema_id)); ?>  
    <?php echo $form->hiddenField($model, 'Usuario_idusuario', array('value'=>$usuario_id)); ?> 
</div> 
<div class="row buttons" style="margin:-3px 0 -8px 176px;"> 
    <?php echo CHtml::submitButton($model->isNewRecord ? 'Responder' : 'Guardar'); ?> 
</div> 

<?php $this->endWidget(); ?> 

任何想法,爲什麼我得到的代碼那個循環?

回答

1

我的猜測(有點遠射),表格ID爲在您的preformAjaxValidation()可能是錯誤的,所以它會導致循環!因爲它不會進入if的正文,因此執行Yii::app()->end();

檢查它在你的控制器

protected function performAjaxValidation($model) 
{ 
    if(isset($_POST['ajax']) && $_POST['ajax']==='exact-form-id')//should be mensaje-form 
    { 
     echo CActiveForm::validate($model); 
     Yii::app()->end(); 
    } 
} 
+0

我的'''performAjaxValidation'''方法看起來和這個完全一樣。 – alexandernst

+0

好的,請嘗試使用螢火蟲檢查以檢查ajax請求的行爲。劑量它實際上是火嗎?是否是無限循環的一部分? – Nimir

+0

我想你讓我失去了那個:s。表單每秒都會發出一些請求,所以我會說是的,ajax請求被解僱了。整個無限循環是表單在請求後發出請求,並且它們都包含正確的數據,並且每個表單的結果都是「[]」(通過驗證) – alexandernst