2013-12-18 2 views
1

Я пытаюсь экспортировать представление twig в csv, но я застрял, может ли кто-нибудь помочь мне с исчерпывающим решением? мир сообщениеsymfony export html.twig to csv

/** 
* 
* @Route("/export", name="export_csv") 
*/ 
public function exportAction() { 

    $entity = new Invite(); 
    $form = $this->createForm(new ManifSearchType(), $entity); 
    $request = $this->get('request'); 

    $em = $this->getDoctrine()->getManager(); 

    $view = $this->render('PrifProtocoleBundle:Invite:index.html.twig', array(
     'form' => $form->createView())); 

    $handle = fopen('php://memory', 'r+'); 
    $header = array(); 

    fputcsv($handle, $view); 

    rewind($handle); 

    $content = stream_get_contents($handle); 
    fclose($handle); 

    return new Response($content, 200, array(
     'Content-Type' => 'application/force-download', 
     'Content-Disposition' => 'attachment; filename="export.csv"' 
    )); 
} 

ошибка:

Warning: fputcsv() expects parameter 2 to be array, object given in C:\wamp\www\protocole\src\Prif\ProtocoleBundle\Controller\InviteController.php line 56 
+0

ваш 'index.html.twig' на самом деле HTML отформатирован? Если он отформатирован csv, есть лучший способ вывода файла csv. – Sehael

+0

привет, спасибо за ответ. я не очень хорошо объяснял свою проблему, я хочу, чтобы на самом деле экспортировать html-форму, отображаемую через index.html.twig в файл csv. – Albee

ответ

3

Дело в том, что вы не пытаетесь конвертировать только веточку в файл CSV. Вы конвертируете HTML в CSV-файл. Теперь это похоже на странное обращение.

Что вы должны сделать, так это то, что ваша ветка генерирует содержимое CSV. Например:

$response = $this->render('PrifProtocoleBundle:Invite:export.csv.twig',array('data' => $data)); 
$response->headers->set('Content-Type', 'text/csv'); 
$response->headers->set('Content-Disposition', 'attachment; filename="export.csv"'); 
return $response; 

И ваша ветка должна быть представлена ​​в формате CSV.

+0

привет, спасибо за ответ. я не очень хорошо объяснял свою проблему, я действительно хочу экспортировать html-форму, отображаемую через index.html.twig в файл csv, возможно ли это? – Albee

+0

В коде, который я вам дал, переданные вами $ данные будут $ form-> getData(). Вы не должны отображать HTML для преобразования в CSV, что не имеет смысла. У вас уже есть данные. Создайте CSV оттуда. Когда кто-то отправляет форму, вы обрабатываете запрос, проверяете, действительна ли форма, затем вы представляете CSV с данными формы. Итак, у вас есть ветка HTML для отображения формы, поэтому пользователь вводит данные. И как только представленные данные верны, у вас есть ветка CSV для рендеринга CSV, который вы хотите экспортировать. У вас должно быть 2 файла twig. Разве это не имеет смысла? –

+0

привет, спасибо за эту точность, я понимаю сейчас. он отлично работает – Albee

0

Попробуйте это:

fputcsv($handle, (array)$view); 
+0

привет, ваше решение работает. он открывает файл export.csv на excel. это хорошо. но форма html, которую я хочу, отсутствует в файле. На самом деле мой index.html.twig отображает форму в http: //localhost/protocole/web/app_dev.php/protocole/invite/export, и я хочу, чтобы эта html-форма была в этом CSV-файле. Знаете ли вы, как я могу изменить свой код, чтобы сделать это? спасибо – Albee

+0

Если вам нужно получить простой HTML-контент, попробуйте renderView вместо рендеринга. –

0

Старый вопрос, но я пришел сюда, когда искал способ отображения рендеринга csv в файле. С Symfony 3.3 (текущая версия сегодня 05/09/2017) был добавлен новый метод файловой системы:

$fs->appendToFile('my.csv', $view); 

Полный пример может быть:

use Symfony\Component\Filesystem\Filesystem; 
use Symfony\Component\Filesystem\Exception\IOExceptionInterface; 

$fs = new Filesystem(); 

try { 
    $fs->appendToFile('my.csv', $view); 
} catch (IOExceptionInterface $e) { 
    echo "An error occurred while adding contents ".$e->getPath(); 
} 

Я еще не проверял, но он должен работы ,

Источник документ: https://symfony.com/doc/current/components/filesystem.html#appendtofile