Dotaz jak udělat vložený formulář

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

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
+
+1
-

@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
+
+1
-

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
+
0
-

moc dekuji , vse prostuduju,
jen k poslednimu prispevku , jak pozna ChildForm ze jeho rodic je ParentForm ?

pospi
Člen | 24
+
0
-

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
+
+1
-

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.