Ukladani csv souboru na disk

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

Ahoj prosim neporadili by jste mi jak ulozit CSV soubor na disk. Mam zatim tohle ale nefunguje mi posledni radek $values->save($folder.‚/‘. $csv);.

$this->addUpload('csv');

        $this->addHidden('id');

        $this->addSubmit('save','Upload')
                ->setAttribute('class','btn btn-info');
public function submitted ($csv, $delimeter = ',')
   {
       $values = $this->values;

       //creat new folder
       $now = new \Nette\Utils\DateTime;

       $year = $now->format('Y');
       $month = $now->format('m');
       $date = $now->format('d');

       $folder = 'CSV/'. $year . '/' .$month. '/'.$date;
       FileSystem::createDir($folder);

      //\Tracy\Dumper::dump($values);die();
       $values->save($folder.'/'. $csv);

a u toho posledniho radku mi to pise

Fatal Error
Call to undefined method Nette\Utils\ArrayHash::save()

Dekuji moc za radu.

David Matějka
Moderator | 6445
+
0
-

ve $values mas objekt se vsemi odeslanymi hodnotami. takze samotny nahrany soubor je v $values->csv. A to csv je pak objekt typu FileUpload s metodou move

parti
Člen | 117
+
0
-

ok takze jsem to dal do stavu

$values->csv->save($folder.'/'. $csv);

a co s tim save?
Fakt promin ale jsem zacatecnik takze kazda rada je nad zlato.
Call to undefined method Nette\Http\FileUpload::save()

h4kuna
Backer | 740
+
0
-

David psal metada move nikoliv save. A udělej dump $values aby jsi viděl co je objekt FileUpload. A ten FileSystem::createDir volat nemusíš move metoda to dělá taky.

$values je objekt nebo by měl být ArrayHash nebo pole? Ten nemá na sobě metodu save.

Editoval h4kuna (11. 1. 2017 9:34)

h4kuna
Backer | 740
+
0
-

Soubory vždy ukládej absolutně, relativní cesty v tomto případě dělají bordel. V proměnné $csv podle výstupu je objekt Form, což asi úplně nechceš.

$values->csv->move($absoludePath . DIRECTORY_SEPARATOR . $values->csv->getSanitizedName());

Absolutní cestu si vyrob, tak že si do této ukládací třídy pošleš část cesty (wwwDir, appDir nevím jestli je chceš mít v privátní nebo veřejné části webu) a z ní budeš vycházet. Víš jak na to? Zkusíš to?

Ještě by bylo dobré ověřit jestli v cílovém adresáři není stejně pojmenovaný soubor.

Editoval h4kuna (11. 1. 2017 10:00)

parti
Člen | 117
+
0
-

promin ale nevim nemohol by si mi to ukazat?
Uz jsem z toho tochu zoufali.

Ted mi to teda vypisuje

Undefined variable: absoludePath

ale tak to je jasny protoze tam neni ta cesta. Pokud tomu trochu rozumim.

h4kuna
Backer | 740
+
0
-

Co udělá?

dump($this);

Jaký je to objekt? Nějaký Presenter? Pokud ano, pokračuj

dump($this->context->parameters['wwwDir']);

Přidej za ten tvůj $folder.

$absoludePath = $this->context->parameters['wwwDir'] . DIRECTORY_SEPARATOR . $folder;

dump($absoludePath);
h4kuna
Backer | 740
+
0
-

Tak evidentně to není presenter.
Pokud máš App\Forms\CsvForm v config.neon jako službu?

Tak si config.neon do služby App\Forms\CsvForm přidej parametr %wwwDir% a uprav si třídu tak že si ten parametr uložíš do vlastnosti třídy.

Ten $this->context->parametes[‚wwwDir‘] nahraď novou vlastností co si založíš.

Pokud ne, tak jak ho instancuješ?

h4kuna
Backer | 740
+
0
-

Pokud ne, tak jak ho instancuješ?

tj. kde vyrábíš objekt pomocí slovíčka new a jaký mu dáváš parametry?

new \App\Forms\CsvForm(...);
h4kuna
Backer | 740
+
0
-

Materiál který si přečti a vyzoušej a zkus to aplikovat na svoji situaci.

h4kuna
Backer | 740
+
0
-

Né to je špatně. Vždyť ho tam máš když to zase smažeš a dumpneš si:

dump($csv);

A to někde musí vzniknout. Kde? A jak?

Editoval h4kuna (11. 1. 2017 11:07)

parti
Člen | 117
+
0
-

ja mam prave dodelat ten update tech dat tak jsem si vyrobil input Upload atd.. a pak na tom buttone volam tu metodu submitted ktera by mela jako prvni bod ulozit to cvs a pak ho nejakym dotazem upgreidovat v db.

h4kuna
Backer | 740
+
0
-

Já ti to programovat nebudu. Stále jsi mi neodpověděl na otázku, kde a jak vytváříš instanci App\Forms\CsvForm. Do této třídy App\Forms\CsvForm je potřeba dostat nastavení z config.neon, aby jsi mohl vytvořit absolutní cestu. Ta proměnná v configu se jmenuje %wwwDir%. Pročti ten materiál co jsem poslal výše.

parti
Člen | 117
+
0
-

Poslal jsem ti to jenom abys si to videl cele jak to je.
Co se tyka te instance tak ta se vytvari slovickem new to my je jasny.
Ale tady v tom kodu to neni nikde vytvorene.
Materialy si prechazim dik za ne.

parti
Člen | 117
+
0
-

Ahoj tak ukladani jsem vyresil jednoduse takto

$file = $values['csv'];
$file->move($folder.'blablabla');

Samozrejme jeste je tam vytvoreni souboru pred tim.
Dik za materialy ty jsem si prostudoval ale to stou absolutni cestou a nastaveni v configu my prislo zbytecne komplikovane, ale jsem jenom zacatecnik takze pokud se mylim rad se neco priucim.