ショッピングカート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:nullのプロパティ'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
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();
?>
そして、ページを送信すると、アラートがtrueになり、ajax.phpを表示すると。が表示されます{"response":1}
。そのため、コード自体は問題ありません。コードをクラス/関数と統合しているだけです。