我正在为购物车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 :无法读取空的属性'response‘,这显然是告诉我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
dscripts.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();
?>当我提交页面时,我得到警告为true,如果我查看ajax.php,则得到{"response":1}。所以代码本身是可以的,它只是将它与它们的类/函数集成起来。
发布于 2012-12-06 20:02:34
似乎是ajax.php文件中的scripts.js文件的路径导致了问题。
这与预prestashop中文件夹的结构有关,所有模块都放在/prestashop/ modules /目录中,但是模块是从/prestashop/admin/查看的。因此,将它们改为完全路径解决了问题。
感谢那些在这里帮忙的人,我们还是很感激他们!
发布于 2012-12-04 22:00:34
我认为您的结果被发送到了ok,但没有被解释为JSON,这是jquery的一点错误--我敢说。
header('Content-Type: text/javascript; charset=utf8');将其放入PHP脚本中应该可以做到这一点,并强制对json数据进行正确解释。如果前面的建议没有给您带来任何好处,也可以尝试使用$.parseJson();就像在jQuery文档中那样:
var obj = jQuery.parseJSON('{"name":"John"}');
alert( obj.name === "John" );https://stackoverflow.com/questions/13696417
复制相似问题