Symfony 2:强制Twig使用\ r \ n换行符

时间:2016-04-05 10:52:21

标签: php symfony csv twig

我正在开发一个Symfony 2应用程序,该应用程序应该创建一个CSV文件供下载:

sep=;
{% for header in headers %}{{ header|trans({}, 'app') }};{% endfor %}

{% for row in data %}
    {% for column in row %}{{ column }};{% endfor %}
{% endfor %}

和控制器:

...
$response = new Response();
$response->headers->set('Content-Type', 'text/csv; charset=UTF-16LE');
$response->headers->set('Content-Disposition', 'attachment;filename="PaymentList.csv"');

$variables = array(
    'headers' => $headers,
    'data' => $data,
);

// Use UTF-16LE with BOM to be compatible with Excel on Win and Mac
$content = $this->renderView('AppBundle:Shop:export.csv.twig', $variables);
$content = chr(255) . chr(254) . mb_convert_encoding($content, 'UTF-16LE', 'UTF-8');
$response->setContent($content);

return $response;

这非常有效,CSV文件可以在Windows和Mac OS X上的Excel中使用。但是,该文件也应该用于需要\r\n换行符的相当旧的会计工具中,而Twig产生\n换行符。

有没有办法告诉Twig改为使用\r\n

当然,我可以在渲染视图后简单地搜索/替换PHP中的换行符。另一个解决方案是,在PHP中完全创建CSV数据而根本不涉及Twig。

这两种解决方案都可行,但我形成的观点并不是很干净。我想控制由Twig创建的输出。这可能吗?

2 个答案:

答案 0 :(得分:3)

Twig将行结尾标准化为\ n,请参阅此处的Github问题: https://github.com/twigphp/Twig/issues/1481

如上所述,如果你想使用Twig生成这个输出,你需要扩展默认词法分析器,或者手动替换输出中的结尾。

答案 1 :(得分:1)

行结尾取决于模板行结尾。但是,如果模板被存储"在VCS中,它可以被转换 - 没有你的直接控制。

开:https://www.designopsy.com/symfony2-export-csv/我发现了类似的内容:

  $response = new StreamedResponse();
  $response->setCallback(function(){

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

      // Add the header of the CSV file
      fputcsv($handle, array('Name', 'Surname', 'Age', 'Sex'),';');
      // Query data from database
      $results = $this->connection->query( "Replace this with your query" );
      // Add the data queried from database
      while( $row = $results->fetch() )
      {
          fputcsv(
              $handle, // The file pointer
              array($row['name'], $row['surname'], $row['age'], $row['sex']), // The fields
          ';' // The delimiter
           );
      }

      fclose($handle);
  });