【问题标题】:Infinite loop trying to validate/save无限循环尝试验证/保存
【发布时间】:2012-09-27 08:35:08
【问题描述】:

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

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

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

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

我已经检查了正在发送的数据,一切都很好(数据和action-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));
    }

}

以及视图中的代码

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

知道为什么我会得到那个循环吗?

【问题讨论】:

    标签: php ajax yii


    【解决方案1】:

    这可能对你有帮助,

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

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

    【讨论】:

    • 完全删除该参数(暂时)并尝试。
    • 你是对的!这是导致错误的原因!太感谢了! :)
    【解决方案2】:

    我的猜测(有点远)你的preformAjaxValidation() 中的form id 可能是错误的,所以它会导致循环!因为它不会进入if 的主体,因此会执行Yii::app()-&gt;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();
        }
    }
    

    【讨论】:

    • 我的performAjaxValidation 方法和这个一模一样。
    • 好的,尝试使用 firebug 检查 ajax 请求的行为。它真的会火吗?它是无限循环的一部分吗?
    • 我认为你在那个问题上失去了我:s。该表单每秒发出几个请求,所以我会说是的,ajax 请求被触发。整个无限循环就是表单在一个请求之后做一个请求,并且都包含正确的数据,并且每个的结果都是“[]”(通过验证)
    猜你喜欢
    • 2016-08-28
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2019-06-15
    • 1970-01-01
    • 2020-12-25
    • 2021-08-14
    相关资源
    最近更新 更多