Dotaz jak udělat vložený formulář
- pospi
- Člen | 24
Ahoj prosim o radu jak v Nette udělat toto:
mám formulář jehož součástí by měl být formulář pro nahraní a
zpracování souboru.
Na základě dat ze souboru se potom následně změní hodnoty
„rodičovského“ formuláře.
- ještě taková drobnost podřízený fomulář by měl mít přístup na prezenter tak abz mohl vyvolat flashMessage
Díky moc za radu , jsem uplný nováček tak budte na mě hodní :)
- ZahorskyJan
- Člen | 59
@pospi můžu doporučit začít tady tímhle videem: https://www.youtube.com/watch?…
A článkem:
https://doc.nette.org/…s/form-reuse
Neměl by být problém podle toho udělat komponentu, která bude mít svoji
vlastní šablonu (v ní se můžou vypisovat flashMesages té komponenty nebo
je tedy posílat do presenteru přes
$this->getPresenter()->flashMessages()
).
Ta komponenta bude mít svoje dvě komponenty (formulář na odeslání souboru a ten rodičovský formulář). A ten rodičovský formulář se bude stavět podle toho, co odeslal ten první.
- artemevsin
- Člen | 61
hodně rychlý nástřel toho, co chceš udělat – tady se formuláře vytvářejí přímo v presentru, ale je lepši použit to, na co odkazuje @ZahorskyJan (druhý odkaz)
<?php
class MyPresenter extends BasePresenter
{
protected function createComponentChildForm()
{
$form = new Form();
$form->addUpload('file', 'Soubor');
$form->addSubmit('send', 'Odeslat');
$form->onSuccess[] = [$this, 'childSuccess'];
return $form;
}
protected function createComponentParentForm()
{
$form = new Form();
$form->addText('text', 'Text');
$form->addSubmit('send', 'Odeslat');
return $form;
}
/**
* Metoda, která se zavolá po úspěšném odeslání child formu
* @param Form $form
*/
public function childSuccess(Form $form)
{
$values = $form->getValues();
/** @var FileUpload $file */
$file = $values->file;
$file->move(__DIR__ . '/../../temp/' . $file->getSanitizedName());
$this['parentForm']->setDefaults(
[
'text' => $file->getSanitizedName()
]
);
$this->flashMessage('Do inputu Text se doplnil název nahraného souboru');
}
}
?>
- pospi
- Člen | 24
jeste jednou :) a zpravne
jak pozna ChildForm ze jeho rodic je ParentForm ?
artemevsin napsal(a):
hodně rychlý nástřel toho, co chceš udělat – tady se formuláře vytvářejí přímo v presentru, ale je lepši použit to, na co odkazuje @ZahorskyJan (druhý odkaz)
<?php class MyPresenter extends BasePresenter { protected function createComponentChildForm() { $form = new Form(); $form->addUpload('file', 'Soubor'); $form->addSubmit('send', 'Odeslat'); $form->onSuccess[] = [$this, 'childSuccess']; return $form; } protected function createComponentParentForm() { $form = new Form(); $form->addText('text', 'Text'); $form->addSubmit('send', 'Odeslat'); return $form; } /** * Metoda, která se zavolá po úspěšném odeslání child formu * @param Form $form */ public function childSuccess(Form $form) { $values = $form->getValues(); /** @var FileUpload $file */ $file = $values->file; $file->move(__DIR__ . '/../../temp/' . $file->getSanitizedName()); $this['parentForm']->setDefaults( [ 'text' => $file->getSanitizedName() ] ); $this->flashMessage('Do inputu Text se doplnil název nahraného souboru'); } } ?>
- ZahorskyJan
- Člen | 59
Není potřeba aby formuláře ve stromu komponent byly přímo podřízeny jeden druhému. Tak jak to nastínil @artemevsin to je asi nejsnadnější cesta k tomu co potřebuješ, aby ovlivnil jeden formulář ten druhý.
Pokud ti jde o zobrazení, tak jednoduchý způsob je si třeba v tom
childSuccess
poslat do šablony nějaký příznak nebo ty data
$this->template->parentFormData
a v šabloně se podle nich
rozhodněš ohledně nějakého vykreslení. Např. že bude vidět jenom ten
první form a když nebude prázdná ta proměnná co sis tam poslal, tak se
zase vykreslí jenom ten druhý form s vyplněnými data (díky
$this['parentForm']->setDefautls()
viz kód).
Nebo kvůli čemu by měl poznávat že jeden formulář je řízen („potomkem“) jiného? Případně sem hoď kód, který trochu víc rozvede myšlenku, kterou v tom chceš zprovoznit.