【问题标题】:Retrieve custom error Jquery检索自定义错误 Jquery
【发布时间】:2015-02-18 18:02:01
【问题描述】:

我不知道如何使用 jquery 在我的表单上显示自定义消息。我正在使用 Yii 并调用一个操作来更新我的数据库。我想要做的是在表单出现问题的情况下显示一些错误消息。

第一个动作是这样的:

if($this->id == "survey") { // Esta condicición es por si se trata de mail, sms, qr o tpe (queda pendiente el callback) ?>
        x$("input#surveysubmit").click(function() {
            var data = serialize(document.getElementById("token-form")); 
            if(!checkRequiredBeforeSubmit(data)) return;
            x$().xhr('<?php echo $this->createUrl('survey/index', array('id'=>$model->skey)); ?>', {
                method: 'POST',
                async: true,
                data: urlstringserialize(serialize(document.getElementById("token-form"))),
                callback: function() {respOK(this.responseText);}
            });
        });

如您所见,这是调用调查/索引。 Index 是一个控制器操作,最终重定向到执行此操作的 Token/Fill:

public function actionFill($id, $agent = '') {
    $model = $this->loadModel($id);

    if(Yii::app()->request->isPostRequest) {
        // Ñapa-parche para seleccionables
        $index = 0;
        foreach($_POST as $key=>$value) {
            if(preg_match('/^'.$key.'/', $value)) {
                $_POST[$value] = 1;
                $BAD = array($key, $value);
                $_POST = array_diff($_POST, $BAD);
                $index++;
            }
        }

        $requiredok = $this->controlRequiredValues($model, $model->transformSurveyRawData($_POST));
        if ($requiredok == '') {
            $isok = $model->createAnswersForToken($model->transformSurveyRawData($_POST));
            if ($isok) {
                $this->redirect(array('view', 'id' => $model->id));
            }
        }
    }
}

controlRequiredValues 是控制错误的函数:

public function controlRequiredValues($model, $answers) {
    //Recupero Oleada
    $wave = $model->wave;
    //Recupero Campaña/Centro
    $campaignCenter = $wave->campaignCenter;
    //Recupero Campaña
    $campaign = $campaignCenter->campaign;
    //Recupero Template
    $template = $campaign->template;
    //Recupero Preguntas del template
    $questions = $campaignCenter->campaign->template->questions;
    //Primero miro si las answers que me vienen en la encuesta son required o no
    foreach($answers['answers'] as $key=>$qvalue) {
        //Si existe la pregunta para la respueta que me han enviado, es una pregunta requerida y su valor es nulo
        $question = Question::model()->findByPk($key);
        if (isset($question) && $question->required == 1 && $qvalue = ""){
            $arr = array('error' => $question->id. " is required");
            return json_encode($arr);
        }
        //Si no, hay que mirar si tiene condicional relacionado con otra pregunta
        else{
            $questioncondition = QuestionCondition::model()->find('question_id=:qid0 AND reqshow=:rs0', array('qid0'=>$question->id, 'rs0'=>'req'));
            if (isset($questioncondition)){
                if (array_key_exists($questioncondition->question_id_dep, $answers['answers'])) {
                    $cond = $qvalue. " " . $questioncondition->operator . " " . $questioncondition->rvalue;
                    if (!$cond){
                        $arr = array('error' => $question->id. " is required");
                        return json_encode($arr);
                    }
                } else {
                    $arr = array('error' => $question->id. " is required");
                    echo json_encode($arr);
                }
            }
        }
    }

    //Ahora miramos en las preguntas del template.
    $questions = $template->questions;

    foreach($questions as $question) {
        //Si en el template dice que la pregunta es required

        if (isset($question) && $question->required == 1) {
            //Puede que no exista en el array de respuestas o si existe que esté en blanco, en cuyo caso mostraremos error.
            if(array_key_exists($question->id, $answers['answers'])) {
                $clave = array_search('', $answers['answers']);
                if (isset($clave)){
                    $arr = array('error' => $question->id. " is required");
                    return json_encode($arr);
                } else {
                    $questioncondition = QuestionCondition::model()->find('question_id=:qid0 AND reqshow=:rs0', array('qid0'=>$question->id, 'rs0'=>'req'));
                    if (isset($questioncondition)){
                        if (array_key_exists($questioncondition->question_id_dep, $answers['answers'])) {
                            $cond = $qvalue. " " . $questioncondition->operator . " " . $questioncondition->rvalue;
                            if (!$cond){
                                $arr = array('error' => $question->id. " is required");
                                return json_encode($arr);
                            }
                        } else {
                            $arr = array('error' => $question->id. " is required");
                            return json_encode($arr);
                        }
                    }
                }
            } else {
                $arr = array('error' => $question->id. " is required");
                return json_encode($arr);
            }
        } else {
            $questioncondition = QuestionCondition::model()->find('question_id=:qid0 AND reqshow=:rs0', array('qid0'=>$question->id, 'rs0'=>'req'));
            if (isset($questioncondition)){
                if (array_key_exists($questioncondition->question_id_dep, $answers['answers'])) {
                    $cond = $qvalue. " " . $questioncondition->operator . " " . $questioncondition->rvalue;
                    if (!$cond){
                        $arr = array('error' => $question->id. " is required");
                        return json_encode($arr);
                    }
                } else {
                    $arr = array('error' => $question->id. " is required");
                    return json_encode($arr);
                }
            }
        }
    }
}

我想做的是向最终用户显示这些错误。

【问题讨论】:

    标签: php jquery yii


    【解决方案1】:

    您可以尝试将默认错误操作与 Flash 消息一起使用。

    public function actionError() {
        if ($error = Yii::app()->errorHandler->error) {
            if (Yii::app()->request->isAjaxRequest)
                Yii::app()->user->setFlash('error', $error['message']);
            else {
                $this->render('error', $error);
                //or
                Yii::app()->user->setFlash('error', $error['message']);
            }
        }
    }
    

    并在 config/main.php 的组件数组中添加:

    'errorHandler'=>array(
            'errorAction'=>'site/error',
    ),
    

    然后在您想要/需要时抛出一个新的基本/自定义异常。

    更多信息在这里:error handling 和这里:flash messages


    编辑:


    实现此功能后,您可以在需要时抛出 CException,而不仅仅是针对此特定请求。
    或者,您可以实现它并保持 controlRequiredValues() 不变并更改它:

    if ($requiredok == '') {
        $isok = $model->createAnswersForToken($model->transformSurveyRawData($_POST));
        if ($isok) {
            $this->redirect(array('view', 'id' => $model->id));
        }
    }
    

    到这里:

    $isok = $model->createAnswersForToken($model->transformSurveyRawData($_POST));
    if ($isok) {
         $this->redirect(array('view', 'id' => $model->id, 'error' => $requiredok));
    }
    

    因此,删除检查 $requiredok 是否为空的 if 语句并将其传递给视图,然后在视图中检查它是否为空,如果不是则抛出 CDbException

    【讨论】:

    • 感谢 Aleksandar B。此 actionError 函数必须代替: $arr = array('error' => $question->id. " is required");返回 json_encode($arr);不是吗?
    • 您在 SiteController 中实现 actionError(),并在配置中将其设置为默认(全局)错误处理程序。而不是return json_encode($arr);echo json_encode($arr); 你会抛出一个像这样的新异常:throw new CDbException('Message here'); 或Http throw new CHttpException($status, 'Message here');。在 CDbException 错误代码是可选的,但对于 CHttpException 它是必需的。我会更详细地更新我的答案。
    • 我无法更改 $requiredok 代码,因为如果出现任何错误,我必须避免创建答案。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多