Почему в Cake PHP 2 я не могу подключить свой контроллер к Ajax? - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблема с проверкой в ​​моем контактном виде. Это мой код для AJAX:

$(document).ready(function(){
    $('.contact_form').submit(function(event){
        event.preventDefault();
        let name = $('#name').val();
        let title = $('#title').val();
        let mail = $('#mail').val();
        let text = $('#text').val();
        $.ajax({ 
            type:'POST',
            url:'../Strona/contact',
            dataType:'json',
            crossDomain:false, 
            cashe:false, 
            contentType:"text/javascript",
            data:{
                name: name,
                title: title,
                mail: mail,
                text: text
             }
        })
        .done(function(data){
            console.log(data);
            if(data.res === 'yes'){
                console.log(data);
                $('.contact_form').html(data.list);
            }else{
                $.each(data.list,function(k,v){
                    console.log(data);
                    $('.error_'+k).append(v);
                });
            }
        });
    });

И мой контроллер:

if($this->request->is('post')){
    $data = $this->data;

    $errors=array();

    if(!$data['Contact']['name']){$errors['name'] = 'Bitte geben Sie einen Namen ein';}
    if(!$data['Contact']['email']){$errors['email'] = 'Bitte geben Sie eine E-Mail-Adresse ein';}
    if(!$data['Contact']['title']){$errors['title'] = 'Bitte geben Sie einen Titel ein';}
    if(!$data['Contact']['description']){$errors['description'] = 'Bitte geben Sie eine Nachricht ein';}
    if(count($errors) > 0){
        $result = array('res'=>'no','list'=>$errors);
        $el['Result'] = $result;
        $el['Contact'] = $data;
        $el['Contact'] = $el['Contact']['Contact'];
        $this->set('errors');
        $this->set('_serialize', array('errors'));
        $this->set('el',$el);
    }else{
        $result = array('res'=>'yes','list'=>'Vielen Dank für das Senden einer E-Mail');
        $txt = $data['Contact']['name'].'<br>'.$data['Contact']['description'];
        $subject = $data['Contact']['title'];
        $from = $data['Contact']['email'];

        $this->Ajax->mailsend($txt, $subject, $from);
        $data['result'] = $result;
        $this->Contact->save($data);
        $this->Session->setFlash('Nachricht gesendet');
        $this->redirect(array('action' => 'contact/'));
    }
}

Когда я нажимаю кнопку, чтобы отправить сообщение и появляется пустой ввод, должна появиться ошибка, но ничего не происходит Я думаю, что AJAX не начинается после отправки, но я не знаю почему.

Я думаю, может быть, проблема в моем взгляде.

<form method="POST" action="" class="contact_form">
    <div class="form-group">
        <input type="text" class="form-control" id="name" name="data[Contact][name]" value="<?php echo $el['Contact']['name']; ?>" placeholder="Dein Name"/>
        <div class="error error_name"></div>
    </div>
    <div class="form-group">
        <input type="email" class="form-control" id="email" aria-describedby="emailHelp" name="data[Contact][email]" value="<?php echo $el['Contact']['email']; ?>" placeholder="Deine E-Mail-Adresse"/>
        <div class="error error_email"></div>
    </div>
    <div class="form-group">
        <input type="text" class="form-control" id="title" name="data[Contact][title]" value="<?php echo $el['Contact']['title']; ?>" placeholder="Betreff"/>
        <div class="error error_title"></div>
    </div>
    <div class="form-group">
        <textarea class="form-control" id="describe" name="data[Contact][description]" placeholder="Deine Nachricht" rows="10"><?php echo $el['Contact']['description']; ?></textarea>
        <div class="error error_description"></div>
    </div>
    <input type="submit" id="send" class="btn btn-primary" value="Senden">
</form>

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я пока не могу добавлять комментарии, поэтому отвечу с моей точки зрения. Кажется, что событие AJAX заключено в функцию. Если вы хотите просто прослушать событие, попробуйте вывести действие submit из функции в блок $(document).ready();, и оно должно сработать. Я также предлагаю вам выполнить проверку формы в JavaScript вместо контроллера. Опубликуйте свои результаты! Надеюсь, это поможет

0 голосов
/ 15 апреля 2020

Вы используете $this->set('el',$el);, но это просто делает переменную $el доступной для любого представления, которое может быть визуализировано. Предполагая, что у вас нет представления Ajax -specifi c, оно может вернуться к стандартному представлению Ajax, которое, я думаю, просто выводит содержимое любых переменных, которые вы установили для сериализации. Вы не установили ничего для сериализации. Смотрите JSON и XML представления , чтобы узнать, как установить переменную _serialized, если вы хотите go.

Если вы хотите быть более явным, вы может заменить этот вызов set и вместо этого отправить строку для ответа:

$this->response->body(json_encode($el));
return $this->response;
...