Ulozeni CSV souboru ze sablony jako win1250

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

Zdravim vsechny,
vytvarim si CSV soubor, ktery bude pouzit jako import dat do jineho systemu. Cilovy system vyzaduje kodovani win-1250, cehoz nejsem schopen dosahnout.

<?php
		$template= new FileTemplate();
        $template->registerFilter(new Latte\Engine());
        $template->setFile(__DIR__.'/../AdminModule/templates/Orders/Export.latte');
        $fileName = 'Export-'.date('Y-m-d').'.csv';

        $content = $template->render();

        $httpResponse = new \Nette\Http\Response;
        $httpResponse->setContentType('application/csv','windows-1250');
        $httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . $fileName . '"');
        $httpResponse->setHeader('Content-Length', strlen($content));
        $httpResponse->setHeader('Content-Description', 'File Transfer');
        $httpResponse->setHeader('Content-Transfer-Encoding', 'binary');
        $this->presenter->sendResponse(new TextResponse(iconv('UTF-8','WINDOWS-1250//TRANSLIT//IGNORE',$content),$fileName));
?>

Zkousel jsem ruzne nastaveni iconv() a bez vysledku. Mam pocit, ze jedine, kdy se mi darilo konvertit utf8->win1250 bylo v pripade, ze jsem iconv() pouzil v sablone a u toho jsem jeste dostaval jine vysledky na testovacim a produkcnim serveru (na produkcnim mi iconv() nad vyrazy s diakritikou vracela null).

Poradite, prosim?

h4kuna
Backer | 740
+
0
-

Taky jsem to řešil a skončil jsem u toho že to rendruju v presenteru.

Je to jeden cyklus předpokládám že to nebudeš mít jiné. S tím že ten text prožeň pomocí iconv. Odpověď je text/csv

llsm
Člen | 121
+
0
-

Také jsem skončil u toho, ze csv tvořím v presenteru.

Tady přikladám mojí fci, je uz trochu historická, ale stále funguje. Trochu jsem ji osekal, v realite mi tvori jen docasny soubor, ktery nekam pak nahraje a v tempu to smaze.

<?php
public function createCSVFile(array $rows, $filename, array $headers = NULL) {
        $fh = fopen($this->context->params['wwwDir'] . '/../files/temp/' . $filename, 'w');
        // csv
        if($headers) {
            $rowResult = array();
            foreach($headers as $header) {
                $rowResult[] = iconv('UTF-8', 'cp1250', $header);
            }
            fputcsv($fh, $rowResult, ';');
        }
        foreach ($rows as $row) {
            $rowResult = array();
            foreach($row as $value) {
                $rowResult[] = iconv('UTF-8', 'cp1250', $value);
            }
            fputcsv($fh, $rowResult, ';');
        }
        fclose($fh);
        return $filename;
    }
?>
Majkl578
Moderator | 1364
+
0
-

Mnohem čistším řešením by bylo vytvoření vlastní response, např. CsvResponse. Tu pak navíc můžete zveřejnit jako addon.

Felix
Nette Core | 1271
+
0
-

Uz to nekdo udelal za vas ;-)

https://componette.org/search/?…

Kdyz jsem to pouzival, tak jsem musel jeste dopsat kodovani do win-1250.

enumag
Člen | 2118
+
0
-

@Felix: Hezký. Jen by to měl někdo upravit pro aktuální Nette s namespaces, dopsat to kódování win-1250, hodit to na GH a přidat balíček na Packagist. :-)