DRUPAL 7: Триггер Запрос на загрузку от вызова Ajax - PullRequest
0 голосов
/ 09 января 2019

Неверный подход к генерации и запуску диалога загрузки. Диалог (загрузка) не может быть инициирован из фонового процесса (вызов AJAX)

Я пытаюсь создать / загрузить файл CSV по нажатию кнопки. Когда я просто пытаюсь создать CSV, код работает нормально, как показано ниже:

Кнопка Drupal:

 $form['Export'] = array(
        '#type' => 'submit',
        '#value' => t('Export'),
        "#ajax" => array(
            "callback" => "export_csv",
            ),

Код обработки:

 $out = fopen('filename.csv', 'w');
           //processing to create file csv
            fputcsv($out, $info, ";");
           fclose($out);

файл csv создается и хранится в корневом каталоге.

Однако, когда я пытаюсь добавить заголовки, приведенный ниже код завершается с ошибкой ajax и без отладочной информации

$fichier = 'inscriptions.csv';
    header( "Content-Type: text/csv;charset=utf-8" );
    header( "Content-Disposition: attachment;filename=\"$fichier\"" );
    header("Pragma: no-cache");
    header("Expires: 0");

    $out =  fopen('php://output', 'w');
    //processing to create file csv
            fputcsv($out, $info, ";");
           fclose($out);

1 Ответ

0 голосов
/ 14 января 2019

Как указано в комментариях @misorude - не пытайтесь инициировать загрузку из фонового запроса, вместо этого сделайте его дружественным способом.

Предположим, у вас есть my_export_module.

В hook_menu

//(...)
//export download csv
$items['export/download-csv'] = array(
  'page callback' => 'my_export_module_download_csv',
  'delivery callback' => 'my_export_module_deliver_csv',
  'type' => MENU_CALLBACK,
);

В my_export_module_download_csv функция. Предположим, $input - это двумерный массив для экспорта.

//(...)
//generate csv
//open tmp stream
$f = fopen('php://temp', 'w');
foreach ($input as $input_line) {
  if (is_array($input_line)) {
    fputcsv($f, $input_line, $delimiter);
  }
}
fclose($f);

return array(
  'name' => $output_file_name,
);

И, наконец, my_export_module_deliver_csv функция

function my_export_module_deliver_csv($var = NULL) {
  drupal_add_http_header('Content-Encoding', 'UTF-8');
  drupal_add_http_header('Content-Type', 'application/csv;charset=UTF-8');
  if (isset($var['name'])) {
    drupal_add_http_header('Content-Disposition', 'attachment; filename="' . $var['name'] . '";');
  }

  if (isset($var['file'])) {
    echo $var['file'];
  }
}

Таким образом, файл не сохраняется на сервере, но при вводе export / download-csv он должен инициировать загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...