在后台PrestaShop模块中使用AJAX

时间:2012-12-04 05:05:07

标签: php ajax json class prestashop

我正在为购物车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,然后您可以检查它是否应该显示表单或结果等。 / p>

但是因为我想用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();
?>

但我总是得到错误未捕获的TypeError:无法读取null 的属性'响应',这显然告诉我data.response没有被正确发送,因为它不知道response是什么。

如果我手动测试页面,一切都运行良好,所以它让我相信它或者它可能与某个类中的事实有关吗?而且我必须做一些与平常不同的事情来让它通过发送数据?

或PrestaShop不允许模块通过AJAX运行,但我在他们的网站上找到的与此相关的唯一事情是某人asking the same question in their forum并且没有回复/修复。

我还要注意,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)

此外,我已将它从课堂中取出并放在正常的页面/单独目录中,并且具有相同的代码,而不是在类/函数内部:

的index.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>

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();
?>

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

2 个答案:

答案 0 :(得分:1)

看起来script.js文件中ajax.php文件的路径导致了问题。

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

感谢那些在这里提供帮助的人,但仍然感激不尽!

答案 1 :(得分:0)

我认为你的结果是正常的,但不能解释为JSON,这是jquerys的一个错误 - 我敢说。

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

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

var obj = jQuery.parseJSON('{"name":"John"}');
alert( obj.name === "John" );