2011-02-16 53 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; 
}