Jde nastavit na tlačítku formuláře signál stejně jako v odkazu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mildabre
Člen | 62
+
0
-

Potřeboval bych poradit jak nastavit signál (subrequest) na tlačítku formuláře.

Mám formulář s tlačítkem „Uložit“ který ukládá data formuláře po události onSuccess.
Přidal jsem tlačítko „Smazat“ a chci aby tento záznam mazal jako subrequest aby se nemusela vytvářet nějaká další akce delete.

Na odkazu udělat signál „smazat“ udělat umím – podle návodu Nette:

<?php
<a n:href="smazat! $record[id]">Smazat</a>
?>

V presenteru se to obslouží takto:

<?php
public function handleSmazat() { ... }
?>

Když jsem ale hledal jak zavěsit signál „smazat“ na submitButton „Smazat“ formuláře, tak jsem žádný postup nenašel.

Nakonec jsem vypotil takovýto kód který sice funguje, ale mě nepřijde čistý:

<?php
// presenter metoda createComponentRecordForm()
 $form->addSubmit('delete','Smazat')
      ->setValidationScope(FALSE)
      ->onClick[] = $this->recordDelete;
// a událost obsloužíme
public function recordDelete(){ ... }
?>

Prosím tedy o radu, jak použít signál na tlačítku formuláře. Děkuji.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

To, jak jsi to udělal, je naprosto správný postup, řekl bych. Na tlačítko nijak klasický signál (handle<Neco> metoda) navázat nejde.

Šaman
Člen | 2666
+
0
-

Nenapadá mě důvod, proč navazovat signál na tlačítko formuláře. Formulář má přece smysl jen tehdy, pokud chci zpracovat zadané hodnoty.
Nestačilo by vytvořit si v šabloně formuláře odkaz (klidně jako html button), který zavolá rovnou požadovaný signál?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Existuje jeden důvod, a to zabezpečení proti CSRF. Aktuálně je v Nette ochrana pouze ve formulářích addProtection(), pro odkazy není, ač o její podobě se vede na Githubu dlouho diskuse.

mildabre
Člen | 62
+
0
-

Šaman napsal(a):

Nenapadá mě důvod, proč navazovat signál na tlačítko formuláře. Formulář má přece smysl jen tehdy, pokud chci zpracovat zadané hodnoty.
Nestačilo by vytvořit si v šabloně formuláře odkaz (klidně jako html button), který zavolá rovnou požadovaný signál?

Nesouhlasím. Zásada pro webové aplikace je „pro akce kdy dochází k trvalé změně v databázi používat metodu POST“ – to znamená formulář odeslaný POST. Změna dat v databázi to není jenom INSERT či UPDATE celého záznamu v databázi, ale třeba smazání, potvrzení, změna nějakého stavu např. koncept/publikovan nenaplanovan/naplanovan, možností je zde celá řada.

Takže když Ti tabulka vyjadřuje nějakou entitu reálného světa je nejpřirozenější pro práci s jedním záznamem použít formulář který umožní editaci i ostatní operace jako smazat, publikovat, naplánovat atd… A to je přece klasický subrequest čili signál. Když to provedu přes onClick tak to je mimo hierarchii Nette presenter/akce/signal.

Předtím než jsem používal Nette jsem jednoduše odchytil v POST které tlačítko spáchalo submit formuláře a na něj jsem měl navázán obslužný kód. Formulář jako takový jsem neobsluhoval protože přece záleží na tom kterým tlačítkem se formulář odešle. Zdá se, že Nette předpokládá hlavně jednotlačítkové formuláře v jednoduchých aplikacích.

Simulovat tlačítko formuláře stylovaným odkazem je nepěkné řešení. Teď mne napadá, že formulář odeslaný POST má jedno společné URL definované atributem action formuláře takže tam ani nejde nastavit analogicky jako v odkazu parametr do=signal. Nakonec kdybych napsal ->onClick[] = handle<Signal>() asi by to fungovalo také a formálně by to vypadalo jako klasický signál na odkazu.

mildabre
Člen | 62
+
0
-

vojtech.dobes napsal(a):

To, jak jsi to udělal, je naprosto správný postup, řekl bych. Na tlačítko nijak klasický signál (handle<Neco> metoda) navázat nejde.

Díky za info, že to nejde. Občas se mě stane, že něco v dokumentaci není ale jde to udělat. Info že to nejde je stejně cenné jako info jak to udělat.