2013-06-25 3 views
0

Я создаю онлайн-приложение, чтобы выбрать набор переменных из нескольких (несвязанных) наборов данных и построить выходные файлы csv для каждого из наборов данных, которые были выбраны (содержащие только выбранные переменные, не все доступные переменные).cakephp генерирует (экспортирует) несколько файлов csv

Это почти работает, за исключением того, что я заканчиваю только одним CSV-файлом, и он содержит только переменные из последнего выбранного набора данных.

Я пытаюсь использовать $ this-> set для передачи данных в вывод ctp вывода путем циклического перехода по массиву выбранных наборов данных (правильно вложенных, чтобы можно было легко использовать циклы foreach). Я могу найти его, потому что у меня есть только один csv, но есть ли у кого-нибудь идеи, как это может быть правильно реализовано в cakephp?

Это представление ctp, используемое для генерации файла csv .. оно работает для одного набора данных.

<?php 

ini_set('max_execution_time', 600); //increase max_execution_time to 10 min if data set is very large 

//create a file 
$filename = "export_".date("Y.m.d").".csv"; 
$csv_file = fopen('php://output', 'w'); 

header('Content-type: application/csv'); 
header('Content-Disposition: attachment; filename="'.$filename.'"'); 
//loop through data array passed by $this->set in controller 
foreach ($end_values as $row) 
{ 
    fputcsv($csv_file,$row,',','"'); 
} 

fclose($csv_file); 
?> 

Я изменил $ имя файла, чтобы включить ссылку на индивидуальный набор данных (только с помощью переменной сеанса в настоящее время) - так что для каждого прохода, имя файла будет отличаться:

$filename = "export_".$this->Session->read('dataset_tag')."_".date("Y.m.d").".csv"; 

Но по-прежнему возникает та же проблема - создается только окончательный набор данных csv.

ответ

1

Вы не можете передавать по нескольким файлам более чем за один файл. Вы должны сгенерировать каждый файл csv, записать на диск, затем создать архив (tar, zip и т. Д.) И отправить им архив.

+0

Привет - спасибо за этот вход dogmatic69. Могу я просто уточнить? Мое действие контроллера посылает один набор данных за раз в представление ctp. Этот вид имеет метод fclose в конце, поэтому он должен закрыть первые csv, прежде чем вторая партия будет отправлена ​​в представление. Я даже пытался заставлять имя файла быть немного различным каждый раз, добавляя тег идентификатора набора данных к имени файла .. это может быть связано с тем, что создание csv для (скажем) первого файла все еще выполняется, когда вторая партия данных уже поступает? –

+0

Я не могу понять, почему фреймворк cakephp хочет помешать кому-то создавать более одного выхода csv за раз ... что, вероятно, отражает мое общее невежество! –

+1

Это не имеет никакого отношения к CakePHP. Вы должны прочитать, как работает HTTP. – dogmatic69