2012-12-03 81 views
1

我有与ID,名称,价格等车返回数据的模型,因此我有一辆车控制器和从模型获取这个数据的CSV动作:Zend框架2 - 渲染CSV数据

$carTable = $this->getServiceLocator()->get('Application\Model\DbTable\Cars'); 
$cars = $carTable->fetchAll(); 

我需要将这个“$ cars”数据作为CSV文件下载,因此用户可以将其存储在磁盘上。

我试图禁用布局并回显一个CSV字符串,并设置“content-type”和其他标题,但它没有开箱即用。然后我发现我应该创建一个自定义的CsvRenderer并在配置中注册它。

因为我无法找到有关这个在ZF2网站或博客和答复#2任何文件,我想知道,如果这是在ZF2下载数据为CSV推荐的一般方法?还是有一个我不知道的更简单的解决方案?

由于

+0

这不是一个需要最终解决方案的地方。你应该带着你想要做的事情来回答你已经试过的一系列事情。您应该针对特定问题提出具体问题! '我想要$ a,我怎么能做到这一点'在这里不是太受欢迎 – Sam

+0

好的。我改进了这个问题。我希望得到一些帮助。谢谢。 –

回答

10

一个解决方案是直接从控制器返回一个响应对象。

事情是这样的代表工作的一个很好的机会:

public function downloadAction() 
{ 
    // magically create $content as a string containing CSV data 

    $response = $this->getResponse(); 
    $headers = $response->getHeaders(); 
    $headers->addHeaderLine('Content-Type', 'text/csv'); 
    $headers->addHeaderLine('Content-Disposition', "attachment; filename=\"my_filen.csv\""); 
    $headers->addHeaderLine('Accept-Ranges', 'bytes'); 
    $headers->addHeaderLine('Content-Length', strlen($content)); 

    $response->setContent($content); 
    return $response; 
} 

(请注意,我没有测试此代码,但符合评论已更新!)

+0

Y ..代码不工作,因为setHeader函数不存在,所以我使用$ response-> getHeaders() - > addHeaders ..但无论如何,一般的方法是正确的,它的工作。谢谢。 –

+1

有人应编辑答案以反映出工作的代码。 – Iznogood

2

得到这个工作:

public function downloadAction() 
{ 
    // magically create $content as a string containing CSV data 

    $response = $this->getResponse(); 
    $response->getHeaders() 
      ->addHeaderLine('Content-Type', 'text/csv') 
      ->addHeaderLine('Content-Disposition', "attachment; filename=\"my_filen.csv\"") 
      ->addHeaderLine('Accept-Ranges', 'bytes') 
      ->addHeaderLine('Content-Length', strlen($content)); 

    $response->setContent($content); 
    return $response; 
} 
2

既然我们在谈论ZF2,我宁愿通过添加一个新的CSV ViewStrategy/Renderer/ViewModel来解决这个问题。

在这里,你可以阅读更多有关实施自己的渲染和应对策略:Zend Docs

,甚至在这里:http://zend-framework-community.634137.n4.nabble.com/ZF2-Implementing-custom-renderer-strategy-td4655896.html

这将打开代码控制器更薄,更清洁,更清晰,因为你不”不必关心控制器中的标题,而是在渲染器中。 然后,您每次需要新的CSV输出时,都无需重新编写该操作,只需使用CSV查看模型