Jak na tlačítko „zrušit“?
- Šaman
- Člen | 2663
Mám formuláře, které mají už defaultně nějakou obsluhu v
onSubmit
. Do toho zasahovat nechci.
Teď ale potřebuji přidat tlačítko „Zrušit“. Pokud ho přidám jako
addSubmit()
, tak se mi spustí ty obslužné rutny, což
nechci.
Když ho přidám jako addButton()
, tak mohu nějak nastavit
obslužnou rutinu? Jde mi buď o možnost zapsat nějakou obsluhu v definici
formuláře (jako je metoda onClick
u submit buttonu), nebo
ajaxové spuštění handleru.
Ideálně bez psaní JS, všechno v definici formuláře.
Editoval Šaman (4. 3. 2019 17:33)
- David Matějka
- Moderator | 6445
ještě by vzhledem k pořadí volání těch eventů šlo udělat, že v onClick cancel buttonu vymažeš onSubmit/onSuccess eventy formuláře. ale spíše bych dopuručil cestu, jak píše @MajklNajt
- duke
- Člen | 650
Na druhou stranu chápu @Šaman, že to chce mít mimo odesílání formuláře. Nač odesílat všechna data formuláře, když uživatel chce jen operaci zrušit (absurdní je to např. v případě, kdy formulář obsahuje upload inputy). Možná by nebylo špatné mít pro tento případ speciální button, který by se nerenderoval jako input/button, ale jako odkaz na signál. Otázka je, nakolik a jak je možné to pak propojit s událostmi formuláře, aby na to šlo navěšovat handlery, které se provedou i jindy než při form submitu. Možná nějak přes rozšíření třídy UI\Form…
- Šaman
- Člen | 2663
Vyřešeno vlastním custom inputem HrefButton
(ale button to
není:). Pracuje se s ním stejně, jako s formulářovým inputem, ale
obsahuje čistý odkaz. Do BootstrapRendereru stačilo přidat jednu podmínku,
aby to tenhle „input“ renderovalo společně s buttony a submity.
Takže mám odkaz, který vede na signál (handleReset
) a který
je normálně ajaxový, když se mu nastaví třída ajax
.
<?php
namespace App\Utils;
use Nette\Forms\Controls\BaseControl;
class HrefButton extends BaseControl
{
protected $href = '#';
protected $class = 'btn btn-default';
function getControl()
{
return "<a href='$this->href' class='$this->class'>$this->caption</a>";
}
// aby se tento "input" nedostal do odeslaných hodnot
public function isOmitted()
{
return TRUE;
}
// aby se při vykreslování nezobrazovalo nic ve sloupci s labely inputů
function getLabel($caption = null)
{
return NULL;
}
public function setHref(string $href)
{
$this->href = $href;
}
public function setClass(string $class)
{
$this->class = $class;
}
public function addClass(string $class)
{
$this->class .= ' ' . $class;
}
}
?>
Použití ve formuláři (tohle přidávám až v presenteru v createComponent…Form. V definici samotného formuláře to nemá co dělat.
<?php
$form = $this->formFactory->create();
// …
$cancelButton = new \App\Utils\HrefButton('Zavřít formulář');
$cancelButton->setHref($this->link('redrawPanel!'));
$cancelButton->addClass('ajax');
$form['cancel'] = $cancelButton;
// …
?>
Výsledkem je „tlačítko“ vyrenderované jako součást formuláře bez nutnosti manuálního renderování.
Editoval Šaman (4. 3. 2019 23:47)
- Šaman
- Člen | 2663
HandleReset obsahuje jen redrawControl()
a volá se nad
nějakým panelem jehož součástí je i formulář. Ale může být
samozřejmě složitější, pokud by bylo potřeba. Pro mě je klíčové, že
nemusím vytvářet JS.
Určitě by to šlo udělat lépe, možná pokud to bude ještě někdy potřeba. Tohle je nejjednodušší nástřel.
A ten Bootstrap3FormRenderer jsem měl upravený uz předtím, tak nevím
kde přesně to bude, ale jedná se o podmínku v metodě
renderControls
. Tam se vybírají prvky, které se pak vykreslí
v poli tlačítek (jinak se v další části podmínky vykreslí jako
běžný pár label – control).
<?php
elseif ($control instanceof Nette\Forms\Controls\Button || $control instanceof \App\Utils\HrefButton) {
$buttons[] = $control;
}
?>
Editoval Šaman (5. 3. 2019 10:07)
- Šaman
- Člen | 2663
@CZechBoY: Zavře to formulář, tedy překreslí panel (tzn. místo formuláře tam je zase tlačítko „přidat“ atd.) Nešlo mi jen o vymazání hodnot.
Kdybych to měl modálně, tak tohle neřeším a jen zavřu celý modal bez uložení změn.
Ono když o tom přemýšlím, tak do sekce „formuláře“ to moc
nepatří. Výsledkem je vlastně odkaz na signál něaké nadřazené
komponenty a ten odkaz by měl být také v té komponentě. Jediný problém,
že požadavek byl aby se to tvářilo jako tlačítko formuláře (protože pro
uživatele to není akce „překreslit celý panel“, ale „zavřít tenhle
formulář“). A bez manuálního renderování.
A html button prostě jako odkaz upravit moc nejde.
Editoval Šaman (5. 3. 2019 11:02)