【问题标题】:Ajax and Json in cakephp 3.xcakephp 3.x 中的 Ajax 和 Json
【发布时间】:2016-07-12 08:17:42
【问题描述】:

在更改下拉列表的值时难以获得控制器的响应,但出现内部服务器错误

$( document ).ready(function() {
   //alert( "ready!" );
    $('#devices-types-id').on('change', function() {
        alert( this.value ); 

         $.ajax({
                type:"POST",
                url: "<?php echo Router::url(array('controller'=>'FeaturesLists','action'=>'ajax_get_parent', '_ext' => 'json'));?>",
                dataType: 'text',
                async:false,
                success: function(data){
                    alert(data);
                },
                error: function (data) {
                    alert(data);
                }
            });

    }); 

但首先出现路径错误

POST http://localhost/compare_devices/features-lists/%3C?php%20echo%20Router::ur…ction%27=%3E%27ajax_get_parent%27,%20%27_ext%27%20=%3E%20%27json%27));?%3E 404 (Not Found)

如果我在 ajax 调用中像这样的 url 写路径:“/ajax_get_parent”,那么它不会给出路径错误,而是“内部服务器错误”

POST http://localhost/compare_devices/features-lists/ajax_get_parent 500 (Internal Server Error)

控制器代码

public function initialize()
{
    parent::initialize();
    $this->loadComponent('RequestHandler');
     $this->Auth->allow(['ajaxGetParent']);
}
public function ajaxGetParent() {
    $this->layout = false;
     $this->set('text', 'SUCCESS');
    $this->set('_serialize', ['text']);
}

在 routes.php 我把这一行

Router::extensions('json', 'xml');

我正在尝试以 json 格式获取结果,但无法获取。你能指导我如何做到这一点。许多问题已经在“SO”上发布了相同的主题,但其中大部分是针对 Cakephp 2.x 的,我尝试了一些不同的解决方案(来自 SO 和谷歌的帮助)但无法解决。你能指导我如何在 json 中获得响应并解决路径问题。

【问题讨论】:

  • 你把 jQuery 脚本放在哪里了?
  • 使用jquery在线echo $this->Html->script('code.jquery.com/jquery.min.js'); echo $this->Html->script('featureList.js');其余代码在名为“featureList.js”的单独文件中,然后将其包含在视图文件中
  • 您包含一个 .js 文件,因此您不能将 php 文件放入其中,因为它不会被解析。这就是您收到 404 错误的原因。关于 500 错误,您必须查看日志以了解发生了什么。你加载 RequestHandler 组件了吗?
  • 这个包含.js文件的视图文件不同,而响应视图(控制器功能)不同
  • 实际上我试图在没有为该操作创建视图文件的情况下获得响应。现在它正在工作。但作为响应,会返回完整的 html 数据。我怎样才能只获得设置数据。 @arilia

标签: jquery json ajax cakephp cakephp-3.0


【解决方案1】:

如果您的 jQuery 代码在同一页面上更改操作名称:

url: "<?php echo Router::url(
  array(
    'controller'=>'FeaturesLists',
    'action'=>'ajaxGetParent',  // <--------
    '_ext' => 'json'
  ));?>",

如果您的 jQuery 代码在外部 .js 文件中:

url: $('#devices-types-id').data('ajax-url);

并在您看来添加:

$this->Form->input('device_type_id',
  ['data-ajax-url' => $this->Url->build([
    'controller'=>'FeaturesLists',
    'action'=>'ajaxGetParent', 
    '_ext' => 'json'])
]);

在路由器中:

Router::extensions(['json']);

控制器方法

public function ajaxGetParent() {
     //remove or comment this line, cakephp by default use ajax.ctp layout.
     #$this->layout = false;

     $this->set('text', 'SUCCESS');
    $this->set('_serialize', ['text']);
}

如果我在 ajax 调用中像这样 url 写入路径:“/ajax_get_parent”,那么它不会给出路径错误而是“内部服务器错误”

试试:

POST http://localhost/compare_devices/features-lists/ajax-get-parent.json

【讨论】:

    【解决方案2】:

    尝试使扩展成为一个数组:

    Router::extensions(['json', 'xml']);
    

    这是一个适合我的 ajax 调用:

    // ajax jquery testing
    function doAjaxTest() {
        $.ajax({
            async:false,
            url: '/requests/get-order-info/123123/2121.json',
            success: function(data){
                alert(data);
            },
            error: function (data) {
                alert(data);
            }
        });
    }
    

    控制器功能是:

    $response['result'] = "success";
    $response['has_info'] = false;
    
    $this->set(compact('response'));
    $this->set('_serialize', ['response']);
    

    您也可以尝试直接在浏览器中访问所需的 URL。还要检查日志以了解确切的服务器错误。在 URL 中使用破折号而不是下划线。

    【讨论】:

      【解决方案3】:

      将 '_full' 参数设置为 true

      url: "<?php echo Router::url(
              array(
                 'controller'=>'FeaturesLists',
                 'action'=>'ajax_get_parent',
                 '_ext' => 'json',
                 '_full' => true //for full url path
           ));?>",
      

      【讨论】:

      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多