2016-10-25 46 views
1

我试图在我的Symfony项目中创建一个函数,该函数根据搜索词在数据库上运行查询,检索数据,然后生成CSV并下载它。我已经遵循了一些关于如何做到这一点的指南,虽然函数没有失败,但它似乎也不起作用。从Symfony2生成并下载CSV

下面是运行生成CSV功能:

public function exportCSVAction($filter) 
{ 
    $container = $this->container; 
    $response = new StreamedResponse(function() use($container,$filter) { 

     $em = $container->get('doctrine')->getManager(); 
     $project_repo = $em->getRepository('AppBundle:Project'); 

     $results = $project_repo->getSearchResults($filter,true); 

     $handle = fopen('php://output', 'w+'); 

     while (false !== ($row = $results)) { 
      fputcsv($handle, $row[0]); 
      $em->detach($row[0]); 
     } 

     fclose($handle); 
    }); 

    $response->headers->set('Content-Type', 'application/force-download'); 
    $response->headers->set('Content-Disposition','attachment; filename="'.getcwd().'/csv/jobs-export.csv"'); 

    return $response; 

} 

在我的仓库的getSearchResults功能:

public function getSearchResults($filter,$array=false) 
{ 

    $qb = $this->createQueryBuilder('p') 
     ->select('p') 
     ->leftJoin('AppBundle:Oc73Customer', 'c', 'WITH', 'c.customerId = p.customerId') 
     ->leftJoin('AppBundle:Oc73Product', 'pr', 'WITH', 'pr.productId = p.productId') 
     ->where('c.firstname LIKE :filter') 
     ->orWhere('c.lastname LIKE :filter') 
     ->orWhere('pr.model LIKE :filter') 
     ->orWhere('p.pONumber LIKE :filter') 
     ->setParameter('filter', '%'.$filter.'%'); 

    if($array == true) { 
     return $qb->getQuery()->getArrayResult(); 
    } else { 
     return $qb->getQuery()->getResult(); 
    } 

} 

正如你所看到的,如果$array为真过去了,它返回一个CSV所需的数组结果。

我运行exportCSVAction功能,如果一个特定的查询字符串传递:

if($request->get('export')) { 
     $this->exportCSVAction($request->get('s')); 
} 

它运行的网页是一个项目列表,并且如果“S”查询传递过滤。如果'导出'也通过,它将像上面那样运行exportCSVAction

该函数不会抛出错误,但它不会下载文件 - 我不知道如何调试它,因为代码被封装在$response对象中,所以它在实际运行后才会返回。

如果任何人都可以解释这一点,我将不胜感激。

+0

为什么不使用Xdebug的或VarDumper组件? –

回答

0

你可以尝试这样的事情吗?

$response->headers->set('Content-Encoding', 'UTF-8'); 
$response->headers->set('Content-Type', 'text/csv; charset=UTF-8'); 
$response->headers->set('Content-Disposition', 'attachment; filename=sample.csv'); 

return $response; 

的问题可能会在这里:文件名=“”。GETCWD() '/ CSV /工作-export.csv”' 的字符串预期下,文件名......不是相对路径。

+0

我尝试了这一点,但是当我加载页面时,它仍然没有做任何事情。这绝对是一个回报,但它似乎甚至没有做什么在StreamedResponse –

0

你可以试试这个:

$response->headers->set('Content-Type', 'text/csv'); 
$response->headers->set('Content-Disposition','attachment; filename="sample"'); 

客人不愿意需要

$response->headers->set('Content-Type', 'application/force-download'); 
0

我用的Symfony \分量\ HttpFoundation \响应;

这里是我的前妻:

<?php 

namespace AppBundle\Controller; 

use AppBundle\Entity\Customers; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 

class ReportController extends Controller 
{ 
    /** 
    * @Route("/report/export_customers_data.csv", name="export_customers_data_csv") 
    */ 
    public function exportCustomersDataCsvAction() 
    { 

     $customers = $this->getCustomersFromDatabase(); 

     $rows = array(); 
     foreach ($customers as $event) { 
      $data = array(
       $event->getId(), 
       $event->getcustNameOne(), 
       $event->getcustNameTwo(), 
       $event->getcustAddress(), 
       $event->getcustCountry(), 
       $event->getcustBusiness(), 
       $event->getcustEmail(), 
       $event->getcustPhone(), 
       $event->getspecialReq() 
      ); 

      $rows[] = implode(',', $data); 
     } 

     $content = implode("\n", $rows); 
     $response = new Response($content); 
     $response->headers->set('Content-Type', 'text/csv'); 

     return $response; 


    } 


    public function getCustomersFromDatabase() 
    { 
     $customers = $this->getDoctrine() 
      ->getRepository('AppBundle:Customers') 
      ->findAll(); 

     return $customers; 
    } 

} 

时,我称之为 “/report/export_customers_data.csv” 下载开始automaticaly

+0

请添加一些解释,这个代码应该做什么,以及它如何处理与陈述的问题。 –