2014-01-15 1 views
1

여기 내 코드와 나는 다음과 같은 코드를 실행하면, 그것은 배열 데이터가있는 CSV 파일을 다운로드뿐만 아니라 페이지에 대한 HTML을 가지고 https://github.com/sonata-project/exporter데이터와 함께 HTML을 보여주는 CSV 내보내기. 왜?

$data = array(
        0 => array(
         'name' => 'Jack' 
        ), 
        1 => array(
         'name' => 'Jill' 
        ) 
       ); 

    $format = 'csv'; 

        // Filename 
        $filename = 'referral.csv'; 

        // Set Content-Type 
        $content_type = 'text/csv'; 

        // Location to Export this to 
        $export_to = 'php://output'; 

        // Data to export 
        $exporter_source = new \Exporter\Source\ArraySourceIterator($data); 

        // Get an Instance of the Writer 
        $exporter_writer = '\Exporter\Writer\\' . ucfirst($format) . 'Writer'; 

        $exporter_writer = new $exporter_writer($export_to); 

        // Set the right headers 
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
        header('Content-Description: File Transfer'); 
        header('Content-type: ' . $content_type); 
        header('Content-Disposition: attachment; filename=' . $filename . ';'); 
        header('Expires: 0'); 
        header('Pragma: public'); 

        // Export to the format 
        \Exporter\Handler::create($exporter_source, $exporter_writer)->export(); 

을 사용하고 있습니다. 내보내기가 데이터 배열의 요소 만 갖도록하려면 어떻게해야합니까?

+0

ㅋ 그냥 내가해야 할 일을했을 모두가 나의 최종 호출하고 고정 후 종료를 호출하는 것을 깨달았다 그것. – kratos

+0

전화 걸기는 실제로 당신이 할 수있는 최악의 일입니다 ... – 1ed

+0

고맙습니다. 나는 당신의 예제를 아래에서 공부하고 이에 따라 제 코드를 수정합니다. 다시 한 번 감사드립니다 – kratos

답변

2

이 코드는 SonataCoreBundle에서이며 메모리 소비를위한 좋은, 그래서 그것은 클라이언트에 respose 스트림 :

use Exporter\Source\SourceIteratorInterface; 
use Symfony\Component\HttpFoundation\StreamedResponse; 

use Exporter\Writer\XlsWriter; 
use Exporter\Writer\XmlWriter; 
use Exporter\Writer\JsonWriter; 
use Exporter\Writer\CsvWriter; 

// ... 

public function exportAction() 
{ 
    $data = array(array('name' => 'Jack'), array('name' => 'Jill')); 
    $source = new \Exporter\Source\ArraySourceIterator($data); 
    $filename = 'file.csv' 
    $format = 'csv'; 

    switch ($format) { 
     case 'xls': 
      $writer  = new XlsWriter('php://output'); 
      $contentType = 'application/vnd.ms-excel'; 
      break; 
     case 'xml': 
      $writer  = new XmlWriter('php://output'); 
      $contentType = 'text/xml'; 
      break; 
     case 'json': 
      $writer  = new JsonWriter('php://output'); 
      $contentType = 'application/json'; 
      break; 
     case 'csv': 
      $writer  = new CsvWriter('php://output', ',', '"', "", true, true); 
      $contentType = 'text/csv'; 
      break; 
     default: 
      throw new \RuntimeException('Invalid format'); 
    } 

    $callback = function() use ($source, $writer) { 
     $handler = \Exporter\Handler::create($source, $writer); 
     $handler->export(); 
    }; 

    return new StreamedResponse($callback, 200, array(
     'Content-Type'  => $contentType, 
     'Content-Disposition' => sprintf('attachment; filename=%s', $filename) 
    )); 
}