我正在为购物车 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}
. 所以代码本身没问题,它只是将它与他们的类/函数集成。