Vyplněný upload souboru v editačním formuláři

kiCkZ
Člen | 153
+
0
-

Zdravim,

nevíte jakým způsobem propsat již uložený soubor do editačního formuláře.

Mam klasický upload:

<?php
	$form->addUpload('upload', 'Soubor s fakturou')
             ->addRule(Form::MIME_TYPE,'%label musí být ve formátu PDF.',['application/pdf'])
             ->setRequired('%label nebyl vybrán');
?>

Poté do session ukládám hodnoty z formuláře

<?php
	public function summaryProcess($form, $values) {
	$file = $values->upload;
	$path = __DIR__.'/../../invoices/received/'.$values->invoice_number.'/'.$file->getSanitizedName();
	if(file_exists(__DIR__.'/../../invoices/received/'.$values->invoice_number)) {
	    $file->move($path);
	} else {
	    mkdir(__DIR__.'/../../invoices/received/'.$values->invoice_number);
	    $file->move($path);
	}
	$this->session->getSection('summaryInvoice')->values = $values;
	$this->session->getSection('summaryInvoice')->values->created_user_id = $this->user->getId();
    }
?>

V posledním kroku mam akci EDIT

<?php

    public function actionEdit($id) {
	$this->id = (int)$id;
	$invoice = $this->receivedInvoiceRepository->get($id);
	if(!$id) {
	    $this['invoiceForm']->setDefaults($this->session->getSection('summaryInvoice')->values);
	} elseif(!$invoice) {
	    $this->error('Faktura nebyla nalezena','error');
	} elseif(!empty($this->session->getSection('summaryInvoice')->values)) {
	    $this['invoiceForm']->setDefaults($this->session->getSection('summaryInvoice')->values);
	} else {
	    $this['invoiceForm']->setDefaults($invoice);
	    $this['invoiceForm']['receive_date']->setDefaultValue($invoice->receive_date->format('Y-m-d'));
	    $this['invoiceForm']['due_date']->setDefaultValue($invoice->due_date->format('Y-m-d'));
	}
    }
?>

Všechny hodnoty se mi do formuláře propisují, ale soubor bohužel v návratu na rozdělaný formulář nemam.
Mam vždy po vyplnění formuláře také tzv. shrnutí, kde se data ze session vypíšou a i v tomto kroku je možnost
se vrátit. Po návratu se soubor ve formuláři i přes existenci nevypíše.

Ondřej Kubíček
Člen | 494
+
0
-

to tam nedostaneš
můžeš třeba pod tím inputem ten soubor zobrazit a u toho odkaz smazat

kiCkZ
Člen | 153
+
0
-

Ondřej Kubíček napsal(a):

to tam nedostaneš
můžeš třeba pod tím inputem ten soubor zobrazit a u toho odkaz smazat

A je nějaká jiná možnost jak toho docílit ?

Kcko
Člen | 465
+
+1
-

kiCkZ napsal(a):

Ondřej Kubíček napsal(a):

to tam nedostaneš
můžeš třeba pod tím inputem ten soubor zobrazit a u toho odkaz smazat

A je nějaká jiná možnost jak toho docílit ?

Ne, a hlavně tohle není vůbec dotaz na Nette, tohle je normální chování form. prvku typu FILE.

kiCkZ
Člen | 153
+
0
-

Ondřej Kubíček napsal(a):

to tam nedostaneš
můžeš třeba pod tím inputem ten soubor zobrazit a u toho odkaz smazat

Pokud mam jen {control invoiceForm}, jak bych to měl dostat pod ten konkrétní input.
Cestu jsem si ještě i nechal uložit do DB.

Ondřej Kubíček
Člen | 494
+
0
-

nedostaneš, bud teda musíš ten form manuálně vykreslit nebo to nacpeš až pod to a třeba csskem posuneš

kiCkZ
Člen | 153
+
0
-

Ondřej Kubíček napsal(a):

nedostaneš, bud teda musíš ten form manuálně vykreslit nebo to nacpeš až pod to a třeba csskem posuneš

To je docela nešťastné, když musim kvuli jednomu prvku vykreslit celý formulář :/

Jan Endel
Člen | 1016
+
0
-

Promiň, nedovedu si představit z UX hlediska nějaký důvod proč by tam měl být zobrazen.

Proč ho tam chceš?

kiCkZ
Člen | 153
+
0
-

Jan Endel napsal(a):

Promiň, nedovedu si představit z UX hlediska nějaký důvod proč by tam měl být zobrazen.

Proč ho tam chceš?

Tak pokud vyplníš formulář a můžeš se do něho vrátit a upravovat hodnoty, tak přeci nechceš pokaždé znovu nahrávat fakturu, jelikož je povinná a je hlavní součástí.

  1. založim si přijatou fakturu v následujícím kroku mam shrnutí, takže si hodnoty z formu načtu do session a až ve shrnutí je možnost ho uložit
  2. poté je možnost si přij. fakturu editovat a v tomto okamžiku nemam nic v upload položce ve formuláři, ale mam její cestu v DB, takže tato věc mě zaráží, že ji nelze vytvořit do formuláře tak, aby byl soubor stejně jako hodnoty ve formuláři

Editoval kiCkZ (15. 3. 2018 11:16)

David Matějka
Moderator | 6445
+
+4
-

muzes pouzit „description“ option, ktery ti tam zobrazi tu aktualni hodnotu:

$form['upload']->setOption('description', 'nazev souboru');

pripadne tam muzes dat Nette\Utils\Html::el(), do ktereho treba muzes dat odkaz na stazeni toho souboru

kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

muzes pouzit „description“ option, ktery ti tam zobrazi tu aktualni hodnotu:

$form['upload']->setOption('description', 'nazev souboru');

pripadne tam muzes dat Nette\Utils\Html::el(), do ktereho treba muzes dat odkaz na stazeni toho souboru

Davide a jak při setRequired na tom uploadu, ten prohlížeč pozná, že tam ten soubor je když je jen v session ?
I přes to, že tam sice ten soubor nastavim, tak mi to nic nedělá a musim ho znovu uploadnout.

David Matějka
Moderator | 6445
+
0
-

@kiCkZ pri editaci vypni setRequired

kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

@kiCkZ pri editaci vypni setRequired

Po přesunutí na další krok mam tento problém:

Unable to move uploaded file '' to ‚C:\xampp\htdocs\ucto\app\forms/../../invoices/received/1212/‘. Přístup byl odepřen.

Což bude způsobeno tím, že mam ve formuláři tento postup:

<?php

    public function create($id) {
	$this->id = $id;
	$form = $this->formFactory->create();

        $year = [];
        for ($i = 2017; $i <= date("Y", time()); $i++) {
            $year[$i] = $i;
        }
	$form->addSelect('year','Rok',$year)
             ->setDefaultValue(date("Y", time()));

	$form->addInteger('number', 'Pořadové číslo')
             ->setEmptyValue('Při nevyplnění bude doplněno automaticky');

	$form->addSelect('customer_id', 'Dodavatel', $this->customerRepository->fetchPairs())
             ->setPrompt('Vyberte dodavatele')
             ->setRequired('Nebyl vybrán dodavatel');

	$form->addText('receive_date', 'Datum přijetí faktury')
	     ->setType('date')
             ->setDefaultValue(date_format(new \DateTime(), 'd-m-Y'))
             ->setRequired('%label nebylo zadáno');

	$form->addInteger('invoice_number', 'Číslo faktury')
             ->addRule(Form::MAX_LENGTH, '%label smí být dlouhé maximálně %d', 15)
             ->setRequired('%label nebylo vyplněno');

	$form->addInteger('variable_symbol', 'Variabilní symbol')
	     ->setRequired(false)
             ->addRule(Form::MAX_LENGTH, '%label může být dlouhý maximálně %d', 10)
             ->addCondition(Form::FILLED)
             ->addRule(Form::PATTERN, '%label musím obsahovat pouze číslice', '^\d+$');

	$form->addUpload('upload', 'Soubor s fakturou')
             ->addRule(Form::MIME_TYPE,'%label musí být ve formátu PDF.',['application/pdf'])
             ->setRequired('%label nebyl vybrán');

	$form->addText('due_date', 'Datum splatnosti')
	     ->setType('date')
             ->setRequired('%label nebylo zadáno');

	$form->addTextArea('subject', 'Předmět fakturace');

	$form->addInteger('amount', 'Částka na faktuře')
             ->addRule(Form::PATTERN, '%label musím obsahovat pouze číslice (případně čárku)', '^-?\d+[.,]?\d+$')
             ->setRequired('%label nebyla vyplněna');

        $form->addSelect('currency_id', 'Měna', $this->currencyRepository->fetchPairs())
             ->setPrompt('Vyberte měnu')
             ->setRequired('%label nebyla vybrána');

//	$form->addMultiSelect('signed_users', 'Schvalující lidé');

	$form->onSuccess[] = [$this,'summaryProcess'];

	$form->addSubmit('send','Uložit');

	return $form;
    }

    public function summaryProcess($form, $values) {
	$file = $values->upload;
	$path = __DIR__.'/../../invoices/received/'.$values->invoice_number.'/'.$file->getSanitizedName();
	if(file_exists(__DIR__.'/../../invoices/received/'.$values->invoice_number)) {
	    $file->move($path);
	} else {
	    mkdir(__DIR__.'/../../invoices/received/'.$values->invoice_number);
	    $file->move($path);
	}
	$this->session->getSection('summaryInvoice')->values = $values;
	$this->session->getSection('summaryInvoice')->values->created_user_id = $this->user->getId();
    }
?>

Mam ten upload hodit až ve chvíli, kdy zapisuji data do DB ? Nebo to lze i takto a není to v rozporu :)

Editoval kiCkZ (15. 3. 2018 13:02)

David Matějka
Moderator | 6445
+
0
-

ten move provedes jen v prvnim kroku a v editu ho muzes provest jen v pripade, ze uzivatel soubor vybral. jinak pouzijes predchozi hodnotu

kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

ten move provedes jen v prvnim kroku a v editu ho muzes provest jen v pripade, ze uzivatel soubor vybral. jinak pouzijes predchozi hodnotu

Prosimtě jakým způsobem ukládáš informace o uploadnutém souboru do DB, aby si v tom kroku kdy už soubor existuje jen načetl údaje o něm ? Já jsem uložil cestu, ale to asi nebude správně, jelikož mi vždy Nette\Http\FileUpload vyhodí vždy prázdné pole v session.

David Matějka
Moderator | 6445
+
0
-

ulozis si tam tu cestu, kam si soubor ulozil na disku ($path, ale obvykle jen relativni vuci nejake root storage dir)

kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

ulozis si tam tu cestu, kam si soubor ulozil na disku ($path, ale obvykle jen relativni vuci nejake root storage dir)

úkládá se mi to takto:

C:\xampp\htdocs\ucto\app\forms/../../invoices/received/123/faktura.pdf

Není na localhostu trohu jiné chování než na klasickém serveru ?

Druhá věc je, že i přes existenci cesty mi to vyhodí error na 4 = UPLOAD_ERR_NO_FILE Value: 4; No file was uploaded.

Dělám to tak, že si všechny hodnoty předám z DB do formuláře, ale hodnota upload, která nese cestu k souboru se mi prostě nespojí a vyhodí mi to prázdné pole viz příklad.

Editoval kiCkZ (15. 3. 2018 15:13)

David Matějka
Moderator | 6445
+
0
-
  • ukladej si do db/nekam tu cestu „/invoices/received/123/faktura.pdf“
  • ano, hlasi ti to, ze nebyl uploadnuty soubor, protoze soubor nebyl uploadnuty
  • hodnota se ti s tim nespoji, uploadu nejde dat defaultni hodnotu, jak jiz bylo reseno vyse. muzes tam pouze zobrazit informaci, ze je soubor jiz nahrany (a zobrazit treba ten jeho nazev) a pri zpracovani formulare ho neukladat a pouzit tu hodnotu z db
kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

  • ukladej si do db/nekam tu cestu „/invoices/received/123/faktura.pdf“
  • ano, hlasi ti to, ze nebyl uploadnuty soubor, protoze soubor nebyl uploadnuty
  • hodnota se ti s tim nespoji, uploadu nejde dat defaultni hodnotu, jak jiz bylo reseno vyse. muzes tam pouze zobrazit informaci, ze je soubor jiz nahrany (a zobrazit treba ten jeho nazev) a pri zpracovani formulare ho neukladat a pouzit tu hodnotu z db

Chápu vše jen vůbec netušim jak udělat to co píšeš zde:

pri zpracovani formulare ho neukladat a pouzit tu hodnotu z db – přesně to nevim jak udělat, měl by si třeba nějaký příklad

Jako jak jí mam použít ? Mam v DB hodnoty ty vypíšu z ní do formuláře a jak si psal, tak není možné jí propsat do inputu, ale tomu přesně nerozumim, jak toto přenést. Jsem přece jen začátečník, takže to je na mě moc obecné.

Editoval kiCkZ (15. 3. 2018 16:05)

David Matějka
Moderator | 6445
+
+1
-
if ($values->upload->isOk()) {
	provedes move a uloz novou cestu
} else {
	soubor se nanahral, pouzijes puvodni cestu z db (tedy v db nic neaktualizujes). jeste ti tam do toho nejak vstupuje session, ale to nevim, co dela..
}