1

我正在为购物车 PrestaShop 创建一个模块,因此在创建一个可在其系统中工作的模块时,我必须遵循一套规则框架,并且我想通过 AJAX 提交表单而不重新加载页面。

这是模块页面的精简版本,它构建并确定显示的内容:

<?php
    class mymodule extends Module
    {
        private $_html = '';

        // Module information
            function __construct()
            {
                // Get shop version
                    $versionMask = explode('.', _PS_VERSION_, 3);
                    $versionTest = $versionMask[0] > 0 && $versionMask[1] > 3;
                // Module info
                    $this->name  = 'MyModule';
                    $this->tab   = $versionTest ? 'administration' : 'Administration';
                    if ($versionTest) { $this->author = 'JD'; }
                    $this->version = '0';
                    parent::__construct();
                    $this->displayName = $this->l('MyModule'); 
                    $this->description = $this->l('Description...');
            }

        // Display content
            public function getContent()
            {
                $this->_displayForm();
                return $this->_html;
            }

        // Build the display
            private function _displayForm()
            {
                $this->_html .= '<script src="../modules/mymodule/scripts.js" type="text/javascript"></script>
                                <form name="formName" id="formName" method="get">
                                    <input type="submit" name="submitModule" value="Continue" />
                                </form>';
            }
    }
?>

通常有一个私有_postProcess函数处理表单数据,然后getContent在页面重新加载时调用该函数,然后您可以检查它是否应该显示表单或结果等。

但是因为我想用 AJAX 来做这件事,所以我已经删除了_postProcess不需要的函数,链接到我的scripts.js,它具有以下内容:

$(document).ready(function() {
    $('#formName').submit(function(e)
    {
        e.preventDefault();
        $.ajax({
            url: "ajax.php",
            type: "GET",
            dataType: "json",
            success: function(data)
            {
                if (data.response == 1)
                {
                    alert('true');
                }
                else
                {
                    alert('false');
                }
            }
        });
    });
});

以及我已经真正修剪过的 ajax.php 文件本身,因此它被迫显示结果:

<?php
    $json['response'] = 1;
    echo json_encode($json);
    exit();
?>

但我总是收到错误Uncaught TypeError: Cannot read property 'response' of null,这显然告诉我 data.response 没有正确发送,因为它不知道是什么response

如果我手动测试页面,一切正常,所以它让我相信它可能与它可能在课堂上的事实有关?而且我必须做一些与往常不同的事情才能让它发送数据?

或者 PrestaShop 不允许模块通过 AJAX 运行,但我可以在他们的网站上找到与此相关的唯一内容是有人在他们的论坛中提出相同的问题,并且没有回复/修复。

我还想指出 AJAX 在一定程度上是有效的,如果在成功功能中我把alert("hello");警报弹出窗口显示出来。

有没有人有任何想法我可能会出错?

Uncaught TypeError: Cannot read property 'response' of null scripts.js:132
$.ajax.success scripts.js:132
o jquery-1.7.2.min.js:2
p.fireWith jquery-1.7.2.min.js:2
w jquery-1.7.2.min.js:4
d

scripts.js:132指的是行:if (data.response == 1)

此外,我已将其从课堂中取出并将其放在普通页面/单独目录中,并具有相同的代码,只是不在类/函数中:

索引.php

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="scripts.js" type="text/javascript"></script>
<form name="formName" id="formName" method="get">
<input type="submit" name="submitModule" value="Continue" />
</form>

脚本.js

$(document).ready(function() {
    $('#formName').submit(function(e)
    {
        e.preventDefault();
        $.ajax({
            url: "ajax.php",
            type: "GET",
            dataType: "json",
            success: function(data)
            {
                if (data.response == 1)
                {
                    alert('true');
                }
                else
                {
                    alert('false');
                }
            }
        });
    });
});

ajax.php

<?php
    $json['response'] = 1;
    echo json_encode($json);
    exit();
?>

当我提交页面时,我得到警报 true,如果我查看 ajax.php,我得到{"response":1}. 所以代码本身没问题,它只是将它与他们的类/函数集成。

4

2 回答 2

1

似乎是 scripts.js 文件中 ajax.php 文件的路径导致了问题。

这与prestashop中文件夹的结构有关,所有模块都放在/prestashop/modules/目录中,但从/prestashop/admin/查看模块。因此,将它们更改为完整路径可以解决问题。

感谢在这里提供帮助的人,仍然很感激!

于 2012-12-06T20:02:34.293 回答
0

我认为您的结果发送正常,但没有被解释为 JSON,有点 jquery 错误 - 我敢说。

header('Content-Type: text/javascript; charset=utf8');

把它放在 PHP 脚本中应该可以解决问题并强制正确解释 json 数据。如果之前的建议没有让你到任何地方,也可以尝试使用 $.parseJson(); 就像在 jQuery 文档中一样:

var obj = jQuery.parseJSON('{"name":"John"}');
alert( obj.name === "John" );
于 2012-12-04T22:00:34.407 回答