尝试验证/保存的无限循环

时间:2012-09-27 08:35:08

标签: php ajax yii

我正在使用Yii框架创建一个非常简单的1文本区域字段和2个隐藏的输入,其中包含从服务器发送的预定义值。

它的工作方式是按预期,我的意思是,你在该文本区域写了一些东西,然后点击发送按钮。进行ajax验证(只有文本区域的必要条件不应为空),如果经过验证,则保存数据并重定向到其他页面。

问题是如果触发了验证错误,它将不会保存任何数据。

我的意思是,如果我转到页面,写一些内容并点击发送按钮,数据将被保存,我将被正确重定向。但是如果我转到页面,点击发送按钮(不在文本区域中输入任何内容),等待出现错误(注意这是通过ajax完成的,所以没有页面重新加载在这里写一些东西并再次点击发送 Yii将在无限循环中的请求之后开始发出请求。

我已经检查了正在发送的数据,一切都很好(数据和动作网址都有)。

这是我的控制器代码

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(); ?>

知道为什么我要接受这个循环吗?

2 个答案:

答案 0 :(得分:1)

我的猜测(有点远)你preformAjaxValidation()中的表单ID 可能有误,所以它会导致循环!因为它不会进入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();
    }
}

答案 1 :(得分:1)

这可能对您有帮助,

http://www.yiiframework.com/forum/index.php/topic/10427-ajax-clientscript/

在您的视图中,renderPartial中的最后一个参数“true”可能是问题。