如何在 Gravity Forms AJAX 提交后启动文件下载
How to initiate a file download after Gravity Forms AJAX submit
我有一个 Gravity Form,用户可以在其中设置复选框来选择要下载的文件。对于增强的用户体验,表单是多页的并使用 AJAX。
使用以下 PHP 函数和 Gravity Forms Hook,我可以遍历选中的复选框并将文件添加到 ZIP 存档中,但目前无法开始下载。
add_filter( 'gform_after_submission_3', 'download_brochures_message', 10, 4 );
function download_brochures_message( $entry ) {
$confirmation = "Your download should begin shortly. \r\n";
$error = "Files not set \r\n";
$file1 = rgar( $entry, '1.1' );
$file2 = rgar( $entry, '1.2' );
$file3 = rgar( $entry, '1.3' );
$file4 = rgar( $entry, '1.4' );
$files = array(
$file1,
$file2,
$file3,
$file4
);
print_r($files);
$zip = new ZipArchive();
$current_time = time();
$file_folder = wp_upload_dir();
$dir = $file_folder['path'];
$zip_file = tempnam( $dir, time() );
$zip->open( $zip_file, ZipArchive::CREATE );
foreach ($files as $file) {
$zip->addFile($file);
}
$zip->close();
echo $zip_file;
header('Content-disposition: attachment; filename="'.$zip_name.'"');
header('Content-type: application/zip');
header('Content-Length: ' . filesize($zip_file));
header("Location: $zip_file");
readfile($zip_file);
}
由于表单是通过 AJAX 提交的,页眉已经发送,我收到的 PHP 错误是 "Cannot modify header information - headers already sent"。我如何修改此代码以允许下载 zip?
要实现一个完全有效的解决方案,需要 PHP 后端函数来处理基于 POST 编辑的表单值创建 zip 和一小部分 JavaScript 来启动下载。
PHP:
/**
* Function to force file download based on user selected checkboxes.
*/
add_filter( 'gform_confirmation_{your-form-id}', 'get_chosen_brochures', 10, 4 );
function get_chosen_brochures( $confirmation, $form, $entry, $ajax ) {
$brochures = retrieve_brochure_data( $entry );
$confirmation = start_brochures_download( $brochures );
return $confirmation;
}
function retrieve_brochure_data( $entry ){
$radio_value_1 = rgar( $entry, '1.1' );
$radio_value_2 = rgar( $entry, '1.2' );
$radio_value_3 = rgar( $entry, '1.3' );
$radio_value_4 = rgar( $entry, '1.4' );
return array(
$radio_value_1,
$radio_value_2,
$radio_value_3,
$radio_value_4
);
}
function start_brochures_download( $brochures ) {
$files = $brochures;
$error = "Files not set";
$success = "Thank you. Your download will being shortly.";
if( $files ) {
$zip = new ZipArchive();
$current_time = time();
$file_name = "Archive-Name-".$current_time.".zip";
$file_folder = wp_upload_dir();
$dir = $file_folder['path'];
$url = $file_folder['url'];
$zip_file = $dir.'/'.$file_name;
$zip_url = $url.'/'.$file_name;
$zip->open( $zip_file, ZipArchive::CREATE );
foreach ($files as $key => $file) {
if( !empty($file) ){
# download file
$download_file = file_get_contents($file);
#add it to the zip
$zip->addFromString(basename($file), $download_file);
}
$error .= "\n *File $key is empty";
}
$zip->close();
return $success . " If your download doesn't begin automatically, you can click <a id='generated-download-link' href='{$zip_url}'>here to start the download</a>.";
} else {
return $error;
}
}
JS:
$(document).bind('gform_confirmation_loaded', function(event, formId){
if( formId === 3 ){
var download_url = $("#generated-download-link").attr('href');
if(download_url) {
var delay = 2000;
setTimeout( function(){ window.location = download_url; }, delay );
}
}
});
我的初始代码问题的最大部分与我无法在页面加载后更改页面 headers 有关。这是使用 AJAX 表单的限制,但是 AJAX 是一项要求,因为存在一些 UX 流程。
要重复使用此代码,您需要将单选按钮或复选框的值设置为您要下载的文件的 URL。
我有一个 Gravity Form,用户可以在其中设置复选框来选择要下载的文件。对于增强的用户体验,表单是多页的并使用 AJAX。
使用以下 PHP 函数和 Gravity Forms Hook,我可以遍历选中的复选框并将文件添加到 ZIP 存档中,但目前无法开始下载。
add_filter( 'gform_after_submission_3', 'download_brochures_message', 10, 4 );
function download_brochures_message( $entry ) {
$confirmation = "Your download should begin shortly. \r\n";
$error = "Files not set \r\n";
$file1 = rgar( $entry, '1.1' );
$file2 = rgar( $entry, '1.2' );
$file3 = rgar( $entry, '1.3' );
$file4 = rgar( $entry, '1.4' );
$files = array(
$file1,
$file2,
$file3,
$file4
);
print_r($files);
$zip = new ZipArchive();
$current_time = time();
$file_folder = wp_upload_dir();
$dir = $file_folder['path'];
$zip_file = tempnam( $dir, time() );
$zip->open( $zip_file, ZipArchive::CREATE );
foreach ($files as $file) {
$zip->addFile($file);
}
$zip->close();
echo $zip_file;
header('Content-disposition: attachment; filename="'.$zip_name.'"');
header('Content-type: application/zip');
header('Content-Length: ' . filesize($zip_file));
header("Location: $zip_file");
readfile($zip_file);
}
由于表单是通过 AJAX 提交的,页眉已经发送,我收到的 PHP 错误是 "Cannot modify header information - headers already sent"。我如何修改此代码以允许下载 zip?
要实现一个完全有效的解决方案,需要 PHP 后端函数来处理基于 POST 编辑的表单值创建 zip 和一小部分 JavaScript 来启动下载。
PHP:
/**
* Function to force file download based on user selected checkboxes.
*/
add_filter( 'gform_confirmation_{your-form-id}', 'get_chosen_brochures', 10, 4 );
function get_chosen_brochures( $confirmation, $form, $entry, $ajax ) {
$brochures = retrieve_brochure_data( $entry );
$confirmation = start_brochures_download( $brochures );
return $confirmation;
}
function retrieve_brochure_data( $entry ){
$radio_value_1 = rgar( $entry, '1.1' );
$radio_value_2 = rgar( $entry, '1.2' );
$radio_value_3 = rgar( $entry, '1.3' );
$radio_value_4 = rgar( $entry, '1.4' );
return array(
$radio_value_1,
$radio_value_2,
$radio_value_3,
$radio_value_4
);
}
function start_brochures_download( $brochures ) {
$files = $brochures;
$error = "Files not set";
$success = "Thank you. Your download will being shortly.";
if( $files ) {
$zip = new ZipArchive();
$current_time = time();
$file_name = "Archive-Name-".$current_time.".zip";
$file_folder = wp_upload_dir();
$dir = $file_folder['path'];
$url = $file_folder['url'];
$zip_file = $dir.'/'.$file_name;
$zip_url = $url.'/'.$file_name;
$zip->open( $zip_file, ZipArchive::CREATE );
foreach ($files as $key => $file) {
if( !empty($file) ){
# download file
$download_file = file_get_contents($file);
#add it to the zip
$zip->addFromString(basename($file), $download_file);
}
$error .= "\n *File $key is empty";
}
$zip->close();
return $success . " If your download doesn't begin automatically, you can click <a id='generated-download-link' href='{$zip_url}'>here to start the download</a>.";
} else {
return $error;
}
}
JS:
$(document).bind('gform_confirmation_loaded', function(event, formId){
if( formId === 3 ){
var download_url = $("#generated-download-link").attr('href');
if(download_url) {
var delay = 2000;
setTimeout( function(){ window.location = download_url; }, delay );
}
}
});
我的初始代码问题的最大部分与我无法在页面加载后更改页面 headers 有关。这是使用 AJAX 表单的限制,但是 AJAX 是一项要求,因为存在一些 UX 流程。
要重复使用此代码,您需要将单选按钮或复选框的值设置为您要下载的文件的 URL。