在Wordpress Admin中从PHP数组创建“下载到CSV”按钮

时间:2017-09-09 21:15:09

标签: javascript php jquery ajax wordpress

我使用函数填充了一个多维PHP数组,我希望允许我的管理员用户下载内容。

我找到了一个PHP函数,它允许我将数组导出为CSV并将其放在我的functions.php中,使用第二个函数将其挂钩到AJAX并使用jQuery来激活AJAX函数。

有什么问题?

所以我99%肯定AJAX正确发布到PHP函数,但由于某种原因下载没有启动。

我已经研究了很多,但很难找到解决方案 - 真的很欣赏正确方向的一点!

// Function to generate download

function convert_to_csv( $input_array, $output_file_name, $delimiter ) {
    /** open raw memory as file, no need for temp files, be careful not to run out of memory thought */
    $f = fopen( 'php://memory', 'w' );
    /** loop through array  */
    foreach ( $input_array as $line ) {
        /** default php csv handler **/
        fputcsv( $f, $line, $delimiter );
    }
    /** rewrind the "file" with the csv lines **/
    fseek( $f, 0 );
    /** modify header to be downloadable csv file **/
    header( 'Content-Type: application/csv' );
    header( 'Content-Disposition: attachement; filename="' . $output_file_name . '";' );
    /** Send file to browser for download */
    fpassthru( $f );
}

我已经使用其他功能

将它连接到Wordpress AJAX
function laura_function() {

    $input_array = $_POST["inputarray"];

    convert_to_csv($input_array, 'output.csv', ',');

    exit;

}
add_action('wp_ajax_nopriv_ajaxlaurafunction', 'laura_function');
add_action('wp_ajax_ajaxlaurafunction', 'laura_function');

我写了一个小jQuery函数来点击按钮

进行AJAX调用
<button type="button" id="downloadcsv">Download CSV</button>

<script>

    jQuery(document).ready(function () {
        jQuery('#downloadcsv').click(function () {

        var data = {
            action: 'ajaxlaurafunction', // Calls PHP function - note it must be hooked to AJAX
           inputarray: '<?php echo $inputarray?>', // Sends a variable to be used in PHP function
        };

        // This is a shortened version of: https://api.jquery.com/jquery.post/

        jQuery.post("<?php echo admin_url('admin-ajax.php'); ?>", data, function () {
            //window.location.replace(location.pathname)
        });

    });
});

1 个答案:

答案 0 :(得分:8)

继@charlietfl建议后,我发现“你无法通过Ajax来实现,因为JavaScript无法将文件直接保存到用户的计算机上(出于安全考虑)。- According to this post

替代解决方案

我的另一种解决方案是使用'post method'来设置post参数。

x: <DomElement.width>, y: <DomElement.height

如果已发布'download_csv'参数,则会运行此代码以下载数据。目前我的代码将输出虚拟数据,但我正在研究它。

// Form on Page 
<form method="post" id="download_form" action="">
    <input type="submit" name="download_csv" class="button-primary" value="Download CSV" />
</form>