首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台PrestaShop模块中使用AJAX

问在后台PrestaShop模块中使用AJAX
EN

Stack Overflow用户
提问于 2012-12-04 05:05:06
回答 2查看 7.7K关注 0票数 1

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

下面是模块页面的修整版本,它构建并确定显示的内容:

代码语言:javascript
复制
<?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,它有以下内容:

代码语言:javascript
复制
$(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文件本身,我已经真正地削减了,所以它被迫显示一个结果:

代码语言:javascript
复制
<?php
    $json['response'] = 1;
    echo json_encode($json);
    exit();
?>

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

如果我手动测试页面,那么一切都很好,所以它让我相信,要么它与它可能在类中的事实有关?我必须做一些与往常不同的事情才能把数据发送出去?

或者PrestaShop不允许模块通过AJAX运行,但是我在他们的站点上找到的唯一与此相关的东西是在他们的论坛上问同样的问题,它没有回复/修复。

我还想指出的是,AJAX在一定程度上起作用,如果在成功函数中,我将alert("hello");放入警告弹出窗口。

有没有人知道我可能出了什么问题?

代码语言:javascript
复制
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

代码语言:javascript
复制
<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

代码语言:javascript
复制
$(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

代码语言:javascript
复制
<?php
    $json['response'] = 1;
    echo json_encode($json);
    exit();
?>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-06 20:02:34

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

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

感谢那些在这里帮忙的人,我们还是很感激他们!

票数 1
EN

Stack Overflow用户

发布于 2012-12-04 22:00:34

我认为您的结果被发送到了ok,但没有被解释为JSON,这是jquery的一点错误--我敢说。

代码语言:javascript
复制
header('Content-Type: text/javascript; charset=utf8');

将其放入PHP脚本中应该可以做到这一点,并强制对json数据进行正确解释。如果前面的建议没有给您带来任何好处,也可以尝试使用$.parseJson();就像在jQuery文档中那样:

代码语言:javascript
复制
var obj = jQuery.parseJSON('{"name":"John"}');
alert( obj.name === "John" );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13696417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档