cakephp 通过 AJAX 向控制器发送请求时出现问题

irlmq6kh  于 2022-11-11  发布在  PHP
关注(0)|答案(2)|浏览(202)

我在联系人视图中遇到了一个验证问题。验证在我的控制器中,我试图通过 AJAX 将表单数据发送到那里。下面是我的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/'));
    }
}

当我点击按钮发送消息,并有一个空的输入错误应该显示,但没有发生任何事情。请求没有发送到控制器。
我想问题可能出在我妻子身上。

<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>
gv8xihay

gv8xihay1#

您使用的是$this->set('el',$el);,但这只会使$el变量对任何可能呈现的视图都可用。我认为它只是转储了你设置为序列化的变量的内容。你没有设置任何要序列化的变量。如果您想这样做,请参见JSON and XML views,了解如何设置_serialized变量。
如果你想更明确地表达,你可以替换set调用,并发送一个字符串作为响应:

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

ibrsph3r2#

我还不能添加评论,所以我会从我的Angular 回答。 AJAX 事件似乎被封装在一个函数中。如果你只想侦听事件,尝试将提交操作从函数中取出,放入一个$(document).ready();块中,它应该会触发。我还建议你在JavaScript中而不是在控制器中进行表单验证。回传你的结果!希望这对你有帮助

相关问题