Export do csv s kódováním windows-1250

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

Dobrý den,
trochu se konečně hrabu v nette a zkouším exporty do csv.. zatím jsem rozchodil:

Model:

<?php
namespace Model;

class Export extends BaseModel
{
    public static function returnData()
    {
        /*
        $row = self::$connection->table('users')
        ->select('id, name, email, password, role')
        ->fetch();
        // vrátím zpět data, při nenalezení NULL
        return ($row) ? $row : NULL;
        */
        $query = "SELECT id, name, email, password, role FROM users";
        $result = self::$connection->query($query);
        $row = $result->fetchAll();
        return $row;
    }
}
?>

Presenter:

<?php
namespace FrontModule\ExportModule;

use Nette, Model\Export;

class DefaultPresenter extends \BasePresenter
{
	public function beforeRender()
	{
       // nastavím hlavičky a název souboru, dále pošlu soubor do prohlížeče pro stažení
       header('Content-Type: application/csv, windows-1250');
       header('Content-Disposition: attachment;filename="test.csv"');
       header('Cache-Control: max-age=0');
       // napojím data
       $this->template->ziskanaData = Export::returnData();
    }

}
?>

Šablona: (csv.latte)

<?php
{extends none}
id;name;email;password;role
{foreach $ziskanaData as $hodnota}
{$hodnota->id};$hodnota->name);{$hodnota->email};{$hodnota->password};{$hodnota->role}
{/foreach}
?>

Takto to funguje, ale je to v utf-8 (což chápu, ale potřeboval bych to, aby to pak bral excel v pohodě a to potřebuje windows-1250, to musím přepsat šablonu na něco takovéto:?

<?php
{extends none}
id;name;email;password;role
{foreach $ziskanaData as $hodnota}
{$hodnota->id};<?php echo iconv("utf-8", "windows-1250", $hodnota->name); ?>;{$hodnota->email};{$hodnota->password};{$hodnota->role}
{/foreach}
?>

Takto mě to sice funguje, ale přijde mě ta šablona pak taková krkolomná…

A dále taky jsem zkoušel dodat jména sloupců do šablony (pole) a to pak vypisovat v šabloně, ale nějak to neplní to co chci:

<?php
{foreach $menuData as $menu}
{if $iterator->isLast()}
{$menu}
{else}
{$menu};
{/if}
{/foreach}
?>

Takto zapíše data do souboru vždy na nový řádek, ale menu by mělo bejt na jednom řádku typu id;name;email

Peter9
Člen | 69
+
0
-

skús použiť python (ak ti to hosting dovolí):
Vyberieš celý súbor ako string, preconvertuješ a uložíš …malo by to pracovať…
http://www.tutorialspoint.com/…g_encode.htm

tatyalien
Člen | 239
+
0
-

To k vůli tomu, musím poustupovat data dalšímu skriptu?

Peter9
Člen | 69
+
0
-

php podporuje prácu v UTF-8 alebo ISO-8859–1… Windows-1250 maximálne cez iconv knižnicu alebo python…

tatyalien
Člen | 239
+
0
-

Peter9: o tom vím, říkám, že ta šablona funguje, když je takto:

<?php
{extends none}
id;name;email;password;role
{foreach $ziskanaData as $hodnota}
{$hodnota->id};<?php echo iconv("utf-8", "windows-1250", $hodnota->name); ?>;{$hodnota->email};{$hodnota->password};{$hodnota->role}
{/foreach}
?>

jen to vypadá hrozně, není nějaký latte zápis na to?

Peter9
Člen | 69
+
0
-

ni. Najskôr ni.

voda
Člen | 561
+
0
-

tatyalien napsal(a):
jen to vypadá hrozně, není nějaký latte zápis na to?

<?php
$this->template->registerHelper('iconv' function($value, $from = 'utf-8', $to = 'windows-1250')	{
	return iconv($from, $to, $value);
});
?>
{$hodnota->name|iconv}

Ale asi ti to takhle neošetří správně escapování. Možná bude jednodušší použít fputcsv.

Editoval voda (13. 2. 2011 18:44)

tatyalien
Člen | 239
+
0
-

voda:
Jo to je ono, takhle to fachá… šablona:

<?php
{extends none}
id;name;email;password;role
{foreach $ziskanaData as $hodnota}
{$hodnota->id|iconv};{$hodnota->name|iconv};{$hodnota->email|iconv};{$hodnota->password|iconv};{$hodnota->role|iconv}
{/foreach}
?>

Presenter:

<?php
namespace FrontModule\ExportModule;

use Nette, Model\Export;

class DefaultPresenter extends \BasePresenter
{
	public function beforeRender()
	{
       // nastavím hlavičky a název souboru, dále pošlu soubor do prohlížeče pro stažení
       header('Content-Type: application/csv, windows-1250');
       header('Content-Disposition: attachment;filename="test.csv"');
       header('Cache-Control: max-age=0');
       // napojím data
       $this->template->menuData = array("a", "b", "cc", "d");
       $this->template->ziskanaData = Export::returnData();
        $this->template->registerHelper('iconv', function($value, $from = 'utf-8', $to = 'windows-1250') {
                return iconv($from, $to, $value);
        });
    }

}
?>

Editoval tatyalien (13. 2. 2011 22:33)

blacksun
Člen | 177
+
0
-

No, nevím, jestli se dá nějak celá šablona rovnou přepnout do cp1250, ale pokud ne a funguje ti výpis dat převedených pomocí iconv do cp1250, převeď je rovnou v té dolovací funkci:

<?php
public static function returnData()
    {
        $query = "SELECT id, name, email, password, role FROM users";
        $resultSet = self::$connection->query($query);
	$outputData = array();

	while ($row = $resultSet->fetch())
	{
	    foreach ($row as $key=>$column)
	    {
		$row[$key] = iconv('utf-8','cp1250',$column);
	    }
	    $outputData[] = $row;
        }

        return $outputData;
    }
?>

Je to nástřel z hlavy, může tam být chyba. Pokud data používáš i jinak, je pak nutné si pamatovat, že budou v cp1250.

tatyalien
Člen | 239
+
0
-

blacksun: Díky, zatím tofachá přez helpery, ale tohle si uložím do poznámek taky ;)