【问题标题】:Posting to controller with jquery ajax in CakePHP在 CakePHP 中使用 jquery ajax 发布到控制器
【发布时间】:2013-05-14 23:16:45
【问题描述】:

我想将数据发布到 CakePHP 中的控制器,但使用 JQuery 发布总是会导致错误,我不知道为什么。

在我看来,我有以下方法,将数据发布到控制器页面

function RenameNode(name, id)
{
    $.ajax({
        type: "POST",
        url: '<?php echo Router::url(array('controller' => 'categories', 'action' => 'rename')); ?>',
        data: {
            id: id,
            name: name
        },
        success: function(){

        }
    });
}

我的控制器方法如下所示:

public function rename($id = null, $name = null) {
    if ($this->request->is('get')) {
        throw new MethodNotAllowedException();
    }

    if(!$id)
    {
        $id = @$this->request->query('id');
    }

    if(!$name)
    {
        $name = @$this->request->query('name');
    }           

    if (!$id) {
        throw new NotFoundException(__('No id'));
    }

    $category = $this->Category->findById($id);
    if (!$category) {
        throw new NotFoundException(__('Invalid category'));
    }

    $this->autoRender = false;
    $this->layout = 'ajax';

    if ($this->request->is('post') || $this->request->is('put')) {
        $this->Category->id = $id;
        $this->request->data['Category']['name'] = $name;


        if ($this->Category->save($this->request->data)) {
            $this->Session->setFlash(__('The category has been updated.'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('Unable to update the category.'));
        }
    }
}

当我使用 jquery 方法发帖时,我的日志中不断收到以下错误消息:

2013-05-20 11:34:25 Error: [NotFoundException] No id
Request URL: /cakephp/categories/rename
Stack Trace:
#0 [internal function]: CategoriesController->rename()

当我评论 get 和 post 的请求检查时,当我使用 /categories/rename?id=1&name=test 调用它时,控制器本身可以正常工作。由于某种原因,ajax 方式不起作用,但我不知道为什么。有什么想法吗?

更新

我通过更改以下代码修复了它,现在它可以正常工作了

    if(!$id)
    {
        $id = @$this->request->query('id');
    }

    if(!$name)
    {
        $name = @$this->request->query('name');
    }

    if(!$id)
    {
        $id = @$this->request->data('id');
    }

    if(!$name)
    {
        $name = @$this->request->data('name');
    }

【问题讨论】:

    标签: php ajax cakephp


    【解决方案1】:

    您在发帖的网址中没有包含id 和/或name

    echo Router::url(array('controller' => 'categories', 'action' => 'rename'));
    

    会输出;

    /categories/rename
    

    但你期待

    /categories/rename/1/test
    

    或者

    /categories/rename?id=1&name=test
    

    将 AJAX 代码中的 URL 更改为类似;

    echo Router::url(array(
       'controller' => 'categories',
       'action' => 'rename',
       0 => $this->request->params['pass'][0],
       1 => $this->request->params['pass'][1]
    ));
    

    应该输出正确的url,包含当前请求的原始idname(例如/categories/rename/123/oldname)

    【讨论】:

    • data: { id: id, name: name }部分负责查询参数,我只有客户端的参数,所以无法用php解析
    • data { id: id..} 负责将发布的数据。您使用 'post' 作为 AJAX 请求的类型,并且 expecting 作为控制器内部的 POST,但是您发布到的 URL 不包括 id也没有名字
    • 啊当然,我应该从$this-&gt;request-&gt;data读取而不是从查询字符串中读取它
    • 这可能是最合乎逻辑的解决方案是的:)
    • 如何仅使用 JS 代码发布?对于 Ajx 函数中的 URL 属性?
    【解决方案2】:

    使用类似的东西

    data = 'name='+name+'&id='id'';
    
    $.ajax({
    
        type:'post', 
    
        url: '/categories/rename',
    
        data: data
    
    });
    

    在控制器功能中

    $name=$_POST[name];
    
    $id=$_POST[id];
    

    【讨论】:

      【解决方案3】:
      $('a.ajax-delete-pdf').on('click', function (event) {
          event.preventDefault();
          var id = $(this).data('id');
          $.ajax(
              {
                  url: webroot + 'productos/ajax_eliminar_pdf/' + id ,
                  async : false,
                  success: function(respuesta)
                  {
                      if(respuesta == 'Borrado')
                      {
                          $(this).parent().toggle();
                      }
                  }
              });
      });
      

      【讨论】:

      • 您可能想要添加一些文本并解释您的代码在做什么。这样一来,很多人都会受益。
      • 考虑到它包含占位符文本,这似乎是一种盲目的复制粘贴。
      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 2016-12-07
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多