我正在为购物车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}
。所以代码本身就可以了,它只是将它与它们的类/函数集成。
答案 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" );