2011-02-16 50 views
2

我想用drupal 6模块输出csv文件。这是我拥有的代码,但是它在我的自定义主题中与其中的一部分一起被黑掉,其中一些在我的模块中。无论如何,我可以将它全部移到我的模块中吗?Drupal6 - 使用MENU_CALLBACK输出CSV

/////////////////////////// 
// csv.module <- a custom module 
/////////////////////////// 
function csv_menu() { 

    $items = array(); 

    $items['csv/results'] = array (
     'page callback' => 'csv_results_page', 
     'access callback' => TRUE, 
     'type' => MENU_CALLBACK, 
    ); 

    return $items; 
} 

function csv_theme() { 
    $items = array(); 

    $items['csv_results'] = array(
     'arguments' => array(), 
    ); 

    return $items; 
} 

function csv_results_page() { 
    return generate_csv_results(); 
} 

function theme_csv_results() { 
    return generate_csv_results(); 
} 

function generate_csv_results() { 
    return "header1,header2,header3,header4\nval1,val2,val3,val4\n"; 
} 


////////////////////////////// 
// page-csv-results.tpl.php <- in my theme. I would like it all contained in the module. 
////////////////////////////// 
<?php 
    //!TODO: Change Content Type Header 
    print theme('csv_results'); 

编辑

下面是一个类似的问题,任何一个国家的更新版本。感谢chx!

/////////////////////////// 
// csv.module <- a custom module 
/////////////////////////// 
function csv_menu() { 

    $items = array(); 

    $items['csv/results'] = array (
     'page callback' => 'csv_results_page', 
     'access callback' => TRUE, 
     'type' => MENU_CALLBACK, 
    ); 

    return $items; 
} 

function csv_results_page() { 
    //Take a look at the Nikit's response on header stuff. This might be incorrect. 
    header('Content-Type: text/x-comma-separated-values'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Cache-Control: private',false); // required for certain browser 
    print generate_csv_results(); 
} 

function generate_csv_results() { 
    return "header1,header2,header3,header4\nval1,val2,val3,val4\n"; 
} 

回答

1

1.4.3 CSV应该只是印刷的东西在页面回调来完成,如果你return你做这将是当前的主题,通过HTML包围,你不需要这一点。

+0

我会试试这个,因为它更接近我想要做的事情。现在有一个ajax消息可以访问静态CSV,并且需要动态。 – Tobias 2011-02-17 16:58:12

+0

对不起,花了这么长时间来标记这是一个答案。我刚开始测试它并修复模块。再次感谢! – Tobias 2011-02-23 16:15:09

2

这是我的导出csv文件的简化版本,将此代码添加到csv_results_page()中。这里使用查询,但可以是其他的东西(如数组,文件列表等):

/** 
* Export to cvs 
*/ 
function _YOURMODULENAME_csv_export() { 
    $delimiter = "\t"; // This is tab delimiter, can be other 

    $temp = file_directory_temp(); 

    $file = tempnam(realpath($temp), 'csv'); 
    if (!$fp = fopen($file, 'a')) { 
    drupal_set_message(t('The file for exported could not be created. Refer to the site administrator'), 'error'); 
    return; 
    } 

    $title = "Some title for csv\n"; // you can remove it, if don't want title in csv 

    $title .= implode($delimiter, array('Column name 1','Column name 2')). "\n"; // Add all columns titles here, it should mutch query result fields below 

    fwrite($fp, $title); 

    $query = 'WRITE HERE SOME CODE THAT SHOULD RESULT QUERY AND RETURN fields in order described in $title above'; 
    $result = db_query($query); 
    while ($data = db_fetch_array($result)) { 
    $rows = implode($delimiter, $data); 
    fwrite($fp, $rows."\n"); 
    } 

    fclose($fp); 

    $header = array(); 

    $header[] = 'Pragma: no-cache'; 
    $header[] = 'Cache-Control: no-cache, must-revalidate'; 
    $header[] = 'Content-Disposition: attachment; filename="exort_'.date('Ymd',time()).'.csv";'; // This is file name 
    $header[] = 'Content-Type: text/x-comma-separated-values'; 
    $header[] = 'Content-Length: '.filesize($file); 
    $header[] = 'Connection: close'; 

    file_transfer($file, $header); 
    file_delete($file); 

    return; 
}