Přidávání componenty v handlu – The signal receiver component ‚addComp-form‘ is not found
- Zbyšek
- Člen | 3
Č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 | 1260
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 | 815
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
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
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í.