如何在Gravity Forms AJAX提交后启动文件下载

4
我有一个Gravity表单,用户可以设置复选框来选择要下载的文件。为了提高用户体验,该表单是多页的,并使用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错误是“无法修改头信息 - 头信息已经被发送”。我该如何修改这段代码以允许zip文件下载?


你有没有找到解决方案?我也在尝试做同样的事情。 - ConorBaumgart
@ConorBaumgart 是的 - 我最终得到了一个解决方案,我会很快为您发布它作为答案。完全忘记了我发布了这个问题,因为它没有看到任何活动! - E.Owen
@ConorBaumgart 嘿,老兄,我已经在下面发布了我的答案/解决方案! - E.Owen
1个回答

5
为了实现这一完整的解决方案,需要使用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 );
        }
    }
});

我对最初的代码有很大的问题,主要是因为在页面加载后无法更改页面头部。这是使用AJAX表单的限制,但由于某些用户体验流程的要求,必须使用AJAX。

要重用此代码,您需要将单选按钮或复选框的值设置为要下载文件的URL。


另外,$radio_value_1 = rgar( $entry, '1.1' ); 应更换为字段ID。如果字段ID为4,则应替换为 $radio_value_1 = rgar( $entry, '4.1' ); 以此类推,包括4.2等。 - Nikolay Bronskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接