Export do csv s kódováním windows-1250
- tatyalien
- Člen | 239
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
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
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?
- voda
- Člen | 561
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
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
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.