Přepisování eventů v dědené komponentě – lze?

zajic
Člen | 1
+
0
-

Zdravím,

potřebuju udělat přívětivé potvrzování mazání různých položek v aplikaci. V současné době tam je „na prase“ js alert, nicméně je třeba to převést na modální okno. To jsem vytvořil jako globální komponentu s nastavitelnými potvrzovacími zprávami a funguje OK. Myšlenka je zhruba takováto:

// BaseControl.php -- BaseControl extends Nette\Application\UI\Control
protected $removeItemGlobalCallback = null;	// empty placeholder for component-specific delete action

protected function createComponentShowRemoveItemConfirmation(): ConfirmDeleteModal
{
    $comp = new ConfirmDeleteModal($this->getPresenter()->translator);
    $comp->onContinue[] = function (int $id) use ($comp) {
		bdump($this->removeItemGlobalCallback);	// debug info - viz nize
        $this->removeItemGlobalCallback($id);
    };
    return $comp;
}

// NějakáKomponenta.php -- NějakáKomponenta extends BaseControl
public function handleShowRemoveItemConfirmation(int $id, string $message = null)
{
    // set callback delete function
    $this->removeItemGlobalCallback = [$this, 'removeContact'];
    // show the modal window
    $this['showRemoveItemConfirmation']->show($id, $message);
}

Čili že mám globální komponentu, která se stará o volání potvrzovacího modálního okna. Přičemž po potvrzení smazání se zavolá mazací funkce specifická pro volající komponentu (smažUživatele, smažPříspěvek apod.). Nicméně takto použité to vyústí v Nette\MembersAccessException a Call to undefined method App\...\Components\...\NějakáKomponenta::removeItemGlobalCallback(). Ovšem debug dump hned před voláním proběhne v pořádku, výstup vypadá v pořádku:

array(2)
	0 => App\...\Components\...\NějakáKomponenta
	1 => "removeContact"

Předpokládám, že to bude souviset nějak s tím, že se „globální“ potvrzovací komponenta tvoří hned na začátku a předávat do ní ex post další data (třeba přepisovat default callback na nějakou jinou funkci) už je pozdě.

Samozřejmě to lze udělat tak, že si napíšu do každé NějakéKomponenty pro každý typ mazání vlastní createComponentShowRemoveItemConfirmation(), ale tomu jsem se chtěl vyhnout…

Máte někdo, prosím, nápad, jak to vyřešit – nebo co tam mám zjevně špatně?

Potřeba je i podobná callback funkce pro vícenásobné mazání, ale to se dá řešit stejně – buď přes callback (vrací stejnou výjimku jako mazání jednotlivých položek), nebo holt vytvářením komponent pro každý typ mazané položky.

Díky moc.


Jen tak pod čarou dodávám, že to včera nějakou dobu takto fungovalo – nicméně dnes, po restartu a rebuildu všeho, už to fungovat přestalo… Možná v tom byla nějaká magie, nějaké persisentní parametry zapsané v URL, nějaký mix všeho, jak jsem zkoušel různé varianty předání hodnoty callbacku… Každopádně to