Přidávání componenty v handlu – The signal receiver component ‚addComp-form‘ is not found

Zbyšek
Člen | 3
+
0
-

Čau, mám problém s přidáváním komponenty obsahující formulář v handlu. Vše se vykreslí atd bez problémů, ale formulář nejde odeslat, viz chyba : The signal receiver component ‚addComp-form‘ is not found.


	//presenter
    public function handleAddComp($idComp) {
        $this->addComponent($this->IAddCompControlFactory->create($idComp), "addComp");
        $this->template->addComp = true;
        $this->redrawControl("addComp");
    }


	//compoonenta

	class AddCompControl extends BaseFormControl {
    public static $COMP_TYPE = [
        'lead' => "Obtížnost",
        'boulder' => "Boulder",
        'speed' => "Rychlost",
        'mix' => "Mix",
    ];

    /** @var Orm $orm */
    public $orm;

    /** @var Competition|null $comp */
    private $comp = null;

    public function __construct(Orm $orm, $compId) {
        $this->orm = $orm;
        $this->comp = $this->orm->competitions->getById($compId);
    }

    public function render() {
        $this->dateInput = ['startDate'];
        parent::render(); // TODO: Change the autogenerated stub
    }

    public function createComponentForm(): Form {
        $form = new Form(); // Nette\Application\UI\Form
        $form->addText("name", "Jméno")
            ->setRequired();
        $form->addSelect("type", "Typ", self::$COMP_TYPE)
            ->setRequired();
        $form->addText("startDate", "Datum")
            ->setHtmlAttribute("class", "bg-primary")
            ->setDefaultValue(date('Y-m-d'))
            ->setRequired();

        $this->setDefaultForm($form);
        $form->addSubmit("save", "Uložit");

        $form->onSuccess[] = function ($form, $values) {
            if ($this->comp) {
                $this->comp->load($values);
                $this->comp->startDate = new DateTimeImmutable(date($values->startDate));
                $this->orm->competitions->persistAndFlush($this->comp);
            }
            $comp = new Competition();
            $comp->load($values);
            $comp->startDate = new DateTimeImmutable(date($values->startDate));
            $comp->user = $this->getPresenter()->getLoginUser();
            $this->orm->competitions->persistAndFlush($comp);


            $this->getPresenter()->flashMessage("Závod byl úspešně přidán!");
        };
        return $form;
    }

    private function setDefaultForm(&$form): void {
        if ($this->comp) {
            $defaults = $this->comp->toArray();

            /** @var DateTimeImmutable $datetime */
            $datetime = $defaults['startDate'];

            $defaults['startDate'] = $datetime->format('Y-m-d');
            $form->setDefaults($defaults);
        }

    }
}

Neměl by jste někdo prosím radu co s tím? V Action componentu přidávat nemůžu, neznám ještě id editovaného záznamu v tu dobu. Díky!

Editoval Zbyšek (16. 9. 2022 12:48)

Marek Bartoš
Nette Blogger | 1171
+
+1
-

Formulář určitě nevytvářej v handle*(). Buď automaticky přes createComponentExample() nebo manuálně nejpozději v action*().

Zpracování formuláře probíhá skrze jeho interní handle metodu a handle metoda se zpracovává vždy pouze jedna za request. Tedy handleAddComp() se při zpracování formuláře nikdy nezavolá.

V Action componentu přidávat nemůžu, neznám ještě id editovaného záznamu v tu dobu

Proč jej neznáš? Tohle budeš muset vyřešit

Editoval Marek Bartoš (16. 9. 2022 13:01)

Kamil Valenta
Člen | 762
+
+1
-

Zbyšek napsal(a):

V Action componentu přidávat nemůžu, neznám ještě id editovaného záznamu v tu dobu.

Pokud neznáš ID záznamu předem, můžeš vytvořit formulář prázdný a default hodnoty do něj načíst ajaxem.
Typicky ve chvíli, kdy je form nějakým detailem položky a rozklikne se např. v modalu.

Zbyšek
Člen | 3
+
0
-

Marek Bartoš napsal(a):

Formulář určitě nevytvářej v handle*(). Buď automaticky přes createComponentExample() nebo manuálně nejpozději v action*().

Zpracování formuláře probíhá skrze jeho interní handle metodu a handle metoda se zpracovává vždy pouze jedna za request. Tedy handleAddComp() se při zpracování formuláře nikdy nezavolá.

V Action componentu přidávat nemůžu, neznám ještě id editovaného záznamu v tu dobu

Proč jej neznáš? Tohle budeš muset vyřešit

Protože formulář zobrazuji na defaultní stránce, kde mám výpis položek. Edituju vždy jen jednu přes ajax a formular zobrazuji v modalu.

Zbyšek
Člen | 3
+
0
-

Kamil Valenta napsal(a):

Zbyšek napsal(a):

V Action componentu přidávat nemůžu, neznám ještě id editovaného záznamu v tu dobu.

Pokud neznáš ID záznamu předem, můžeš vytvořit formulář prázdný a default hodnoty do něj načíst ajaxem.
Typicky ve chvíli, kdy je form nějakým detailem položky a rozklikne se např. v modalu.

Díky, to zní jako řešení.