Vyplněný upload souboru v editačním formuláři
- kiCkZ
- Člen | 153
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
to tam nedostaneš
můžeš třeba pod tím inputem ten soubor zobrazit a u toho odkaz smazat
- Ondřej Kubíček
- Člen | 494
nedostaneš, bud teda musíš ten form manuálně vykreslit nebo to nacpeš až pod to a třeba csskem posuneš
- kiCkZ
- Člen | 153
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í.
- 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
- 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
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
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.
- kiCkZ
- Člen | 153
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
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
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
ulozis si tam tu cestu, kam si soubor ulozil na disku ($path, ale obvykle jen relativni vuci nejake root storage dir)
- kiCkZ
- Člen | 153
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
- 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
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
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..
}