ユーザーがフォームに記入し、送信時にカスタマイズしたZipファイルをダウンロードできるようにするアプリケーションを作成しています。私はこのタスクを達成するためにAJAXを利用しています。
Build.prototype.ajaxHandler = function(method, values) {
jQuery.ajax({
type: 'POST',
url: WP_LOCALIZED['url'],
data: {
action: 'request_handler',
method: method,
data: values
}, success: function(data) {
var response = jQuery.parseJSON(data);
console.log(response);
}, error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest, textStatus, errorThrown);
}
});
};
Ajaxハンドラーで基本データを返そうとすると問題なく返事を返すことができますが、Zip_file()
メソッドが実際にはjavascriptメソッドにデータを返さないにもかかわらず、私は常にUncaught SyntaxError: Unexpected token <
を取得します。
/**
* AJAX handler
*
* @return {json}
* @since 1.0
*/
public function request_handler()
{
$post = $_POST;
$data = $post['data'];
// If this wasn't here it would return my $data variable
$this->Zip_file();
die(json_encode($data));
}
また、Zip_file()
メソッドをinit()
関数に配置することで独自にテストしましたが、問題なく実行できると予想されるとおりに実行されます。
/**
* Create Zip File
*
* @return void
* @since 1.0
*/
public function Zip_file()
{
$Zip = new ZipArchive;
if($Zip->open('test.Zip', ZipArchive::CREATE) === TRUE) {
if($Zip->addEmptyDir($this->_plugin_path . 'assets/temp_files')) {
// Do stuff
}
$Zip->close();
}
header('Content-Type: application/Zip');
header('Content-disposition: attachment; filename=filename.Zip');
header('Content-Length: ' . filesize($Zip));
readfile($Zip);
}
興味深いことに、$this->Zip_file()
呼び出しを基本的なecho
ステートメントに置き換えた場合も同じことが起こります。 Unexpected token
が<
であることを私に伝える代わりに、それは代わりにe
を言います。
私は、この2つが相互に作用する方法について基本的なことを誤解していると思いますが、これまでのところ、それに関する情報を見つけることができませんでした。
任意の助けがいただければ幸いです。
AJAXレスポンスを返す前にバッファをクリアするようにしてください。
public function request_handler() {
$post = $_POST;
$data = $post['data'];
$this->Zip_file();
ob_clean();
echo json_encode($data);
die();
}