jak vrátit hodnotu, kterou generuje komponenta

Thommie
Člen | 32
+
0
-

Ahoj,

mám komponentu, která mi udělá jeden input k instanci formuláře, který jí pošlu.

Jak v prezenteru udělám to, abych dostal zase tu instanci zpět?

Formulář v komponentě Vyhledavani:

protected function createComponentVlozitInput() {
        if(!is_object($this->form)) {
            $form = new Form;
        } else {
            $form = $this->form;
        }

        $form->addText($this->nazev_inputu, 'Vyhledávání')
                ->setAttribute("placeholder", $this->placeholder)
                ->setAttribute("class", $this->nazev_inputu)
                ->setRequired(FALSE);

        $form->addProtection('Vypršel časový limit, zkuste to prosím znovu');

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

        return $form;
    }

Formulář v prezenteru, kam potřebuji předat input z komponenty:

public function createComponentFormPrehledNeceho() {
        $form = new Form;

        $form->addText("neco", 'Něco')
                ->setAttribute("placeholder", "")
                ->setAttribute("class", "")
                ->setRequired(FALSE);

        $kam_smerovat = "";
        $placeholder = "Název produktu";
        $kde_hledat = array(

        );

        //jaká data potřebujeme vrátit
        $output = array(

        );

        $odeslat_form = 0;
        $nazev_inputu = "vyhledat_produkty_test";

        $form = $this->createComponentVlozitInput($form);

        $form->addProtection('Vypršel časový limit, zkuste to prosím znovu');

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

        return $form;
    }

Toto mi vyhazuje chybu, protože komponenta nevrací instanci formuláře ale komponentu jako takovou.

Díky za radu

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

createComponentVlozitInput nemá žádný parametr a ty tam předáváš $form, tak předpokládám že v té metodě chceš pracovat s tím a navíc ty to potřebuješ mít jako komponentu, proč to není obyčejná metoda, která jen formu přidá další input?

Thommie
Člen | 32
+
0
-

Díky za odpověď. Komponentou to dělám proto, ze k tomu mám i šablonu s JS a hodí se mi to mít takto parametrizovany a pohromadě. Instanci form do té komponenty predam, ale problem je, jak ji vrátit zpět do toho formuláře v presenteru.

filsedla
Člen | 101
+
+1
-

Ahoj. Tak, za prvé, objekty formuláře $form nejsou immutable, a předávají se referencí, tudíž když je někam předáš a tam změníš, změna se projeví i na původní instanci. Tudíž problém nemůže být v tom, že bys neměl způsob, jak $form vrátit zase „výš“.

Tenhle kód nemá smysl, přesněji jeho část $form = ...

$form = $this->createComponentVlozitInput($form);

Taky nemusíš psát $form = $form->addText("neco", 'Něco'), ale jen $form->addText("neco", 'Něco').

Editoval filsedla (9. 8. 2019 17:51)

filsedla
Člen | 101
+
+1
-

Nejde to mít komponentu s jedním inputem formuláře. Nette se s tím nevypořádá.

Běžně se dává do komponenty celý formulář, jednotlivé inputy můžeš mít i v samostatných šablonách, ale ne v samostatné komponentě, myšleno Nette\Application\UI\Control.

Thommie
Člen | 32
+
0
-

Díky, nakonec jsem formulář udělal mimo komponentu.