CakePHP 2.1 Ошибки проверки Ajax

Я пытаюсь получить ошибки проверки с помощью Ajax и jQuery, работающих в CakePHP 2.1 для контактной формы. При размытии поля имени вызывается функция js:

$(document).ready(function(){

$('#name').blur(function(){
    $.post(
        '/Cake_ajax/Contacts/validate_form',
        { field: $(this).attr('id'), value: $(this).val() },
        handleNameValidation
    );
});

function handleNameValidation(error){
    if(error.length > 0){
        if($('#name-notEmpty').length == 0){
            $('#name').after($('<div id="name-notEmpty" class="error-message">' + error + '</div>'));
        }
    }else{
        $('#name-notEmpty').remove();
    }
}
});

JavaScript вызывает функцию validate_form в моем контроллере:

public function validate_form(){
        if($this->RequestHandler->isAjax()){
            $this->request->data['Contact'][$this->request->params['form']['field']] = $this->request->params['form']['value'];
            $this->Contact->set($this->request->data);
            if($this->Contact->validates()){
                $this->autorender = FALSE; // don't render a view
            }else{
                $error = $this->validateErrors($this->Contact);
                $this->set('error', $error[$this->request->params['form']['field']]);
            }
        }
    }

На мой взгляд, я получаю пару ошибок при вызове ошибки:

Undefined index: form [APP\Controller\ContactsController.php
Undefined index: form [APP\Controller\ContactsController.php

Я в замешательстве, и я новичок в CakePHP. Любая помощь будет принята с благодарностью.


person Ryan Potter    schedule 19.04.2012    source источник


Ответы (3)


В вашем контроллере у вас должно быть что-то вроде ниже. Cake 2.0 заменяет многие функции в RequestHandlerComponent и Controller. Он также заменяет массив $this->params во всех местах и ​​старый массив $this->data на $this->request->data, что-то в этом роде. Вы можете ознакомиться с руководством по миграции.

    public function validate_form(){
        if($this->RequestHandler->isAjax()){
           $this->request->data['Contact'][$this->request['form']['field']] = $this->request['form']['value'];
           $this->Contact->set($this->request->data);
           if($this->Contact->validates()){
              $this->autorender = FALSE; // don't render a view
           }else{
             $error = $this->validateErrors($this->Contact);
             // didn't validate logic
             $this->set('error',$this->Contact->validationErrors[$this->request['data']['field']][0]);
          }
       }
    }
person Bob    schedule 20.04.2012
comment
Также вы можете pr($this->request); или pr($this); - person Bob; 20.04.2012
comment
// не проверил логику $this->set('error',$error[$this->request['data']['field']][0]); - person Bob; 20.04.2012
comment
Я изменил «форму» на «данные», и это сработало: D, большое спасибо. - person Ryan Potter; 23.04.2012

Попробуйте $this->request->params['field'] вместо $this->request->params['form']['field'].

Или сразу после проверки на isAjax() попробуйте сделать var_dump на $this->request->params. Из-за ошибки, которую вы получаете, индекс формы не существует в $this->request->params.

person kmfk    schedule 19.04.2012
comment
Первый бит не помог, я боюсь. Я сделал var_dump данных $this-›request-›И он вернул: array(2) { [field]=>string(4) name [value]=>string(0) } - person Ryan Potter; 20.04.2012
comment
Да, взгляните на документы: book.cakephp.org/2.0 /en/controllers/request-response.html — вы делаете запрос из сообщения ajax, а не отправки формы, поэтому эти поля не будут внутри массива формы. надеюсь, это поможет - person kmfk; 20.04.2012
comment
Удалено ['form'], теперь я получаю: Undefined index: field и Undefined index: field - person Ryan Potter; 20.04.2012

Если вы хотите имитировать POST, как это делается при использовании стандартной формы и Cake FormHelper, вы также можете просто назвать публикуемые параметры так же, как FormHelper называет поля ввода.

$j.post(
    '/Cake_ajax/Contacts/validate_form',
    { "data[Contact][" + $(this).attr('id') + "]": $(this).val() },
    handleNameValidation
);

Это автоматически заполнит $this->request->data['Contact']['name'], и вы можете просто прокомментировать эту строку:

//$this->request->data['Contact'][$this->request->params['form']['field']] = $this->request->params['form']['value'];
person nIcO    schedule 20.04.2012