Drupal6 - вывод CSV с помощью MENU_CALLBACK - PullRequest
2 голосов
/ 16 февраля 2011

Я хотел бы вывести CSV-файл с модулем drupal 6. Это код, который у меня есть, но он взломан вместе с некоторыми из них в моей пользовательской теме, а некоторые с моим модулем. Можно ли как-нибудь перенести все это в мой модуль?

///////////////////////////
// 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');

EDIT

Ниже приведена обновленная версия для тех, у кого похожий вопрос. Спасибо идет к 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";
}

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Это моя упрощенная версия экспорта 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;
}
1 голос
/ 17 февраля 2011

Вывод CSV должен быть сделан путем простой печати содержимого в обратном вызове страницы, если вы return, как вы это делаете, будет в текущей теме, окруженной HTML, и вам это не нужно.

...