Vygenerování txt souboru a odeslání ke stažení

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ecrazit
Člen | 16
+
0
-

Ahoj,

v presenteru mám k dispozici pole s určitým počtem prvků, které obsahují texty. Potřeboval bych z tohoto pole vytvořit .txt soubor, kde budou ty jednotlivé prvky odděleny prázdnými řádky a po vytvoření tento .txt soubor odeslat ke stažení. Je tohle možné v nette udělat?

Felix
Nette Core | 1245
+
0
-
$this->sendResponse(new Nette\Application\Responses\FileResponse($file, $name, $contentType));
Ecrazit
Člen | 16
+
0
-

jj takto soubor předám ke stažení, ale zajímalo by mě, jak připravím ten template, který tomu pak předám. Respektive jak v presenteru ten template vytvořím, aniž bych k němu musel mít vytvořený nějaký latte soubor.

Editoval Ecrazit (24. 9. 2012 19:47)

Felix
Nette Core | 1245
+
0
-

Pokud si to nevygenerujes rucne do promenny tak to jinak nejde. Nejlepsi je to mit v latte souboru a jenom nasetovat promenne a pak odeslat.

Ecrazit
Člen | 16
+
0
-

Snažím se to nějak sepsat, ale když to spustím, skončí mi to v prohlížeči jako Spojení přerušeno, takže netuším, co dělám špatně.

$template = new \Nette\Templating\Template();
$template->registerFilter(new \Nette\Latte\Engine);
$template->setSource('<a href="#">link</a>');
$template->render();
$this->presenter->sendResponse(new \Nette\Application\Responses\FileResponse($template, time() . '.txt', 'text/plain'));
jansfabik
Člen | 193
+
0
-

TextResponse umí vracet text, bohužel ne jako soubor (že by feature request?).

use Nette\Application\Responses\TextResponse,
    Nette\Latte,
    Nette\Templating\Template;

$template = new Template();
$template->registerFilter(new Latte\Engine);
$template->setSource('<a href="#">link</a>');

$name = time() . '.txt';
$content = (string) $template;

$httpResponse = $this->presenter->getHttpResponse();
$httpResponse->setContentType('text/plain');
$httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . $name . '"');
$httpResponse->setHeader('Content-Length', strlen($content));
$this->presenter->sendResponse(new TextResponse($content));
Ecrazit
Člen | 16
+
0
-

Takhle mi to funguje… díky. Snažím se ale výsledný text nějak zformátovat, potřeboval bych tam nějaké odřádkování a vkládám tam tedy \n.

$source = "";
foreach ($row as $item) {
    $source .= $item->text . "\n\n";
}

Ve výsledném txt ale žádné odřádkování není. Když zkusím například \t, tak tabelátory se zobrazí správně.

jansfabik
Člen | 193
+
0
-

A v proměnné $source máš kód, který pak formátuješ pomocí Latte?

Edit: Pokud používáš Windows, tak tam musíš dát \r\n.

Edit 2: Můžeš to kdyžtak použít i úplně bez Latte:

use Nette\Application\Responses\TextResponse;

$name = time() . '.txt';
$content = '';
foreach ($row as $item) {
    $content .= $item->text . "\r\n\r\n";
}

$httpResponse = $this->presenter->getHttpResponse();
$httpResponse->setContentType('text/plain');
$httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . $name . '"');
$httpResponse->setHeader('Content-Length', strlen($content));
$this->presenter->sendResponse(new TextResponse($content));

Editoval jansfabik (24. 9. 2012 22:50)

Ecrazit
Člen | 16
+
0
-

jj ted je to perfektní, bez latte to udelane mam. Díky za pomoc.