Tlačítko v latte s value odkazující na action

popcorn
Člen | 28
+
0
-

Ahoj, potřeboval bych si v latte vytvořit xx tlačítek, které budou mít value a budou odkazovat na actionRemove, ale nevím, jak přesně toho docílit abych získal tu hodnotu z tlačítka. Musím pro to vytvořit celý formulář i když potřebuji jen tlačítko?

Momentálně jsem se dostal sem:
Latte:

<form action=":Settings:removeUser"><button type="submit" value="{user['id']}">Remove</button></form>

V SettingsPresenter mám:

public function actionRemoveUser()
{
    $this->settingsManager->removeUser();
    $this->redirect(':Default');
}

^ Zde právě nevím kam dát zařadit tu value z tlačítka jako proměnnou.

Nebo by jste to řešili celé jinak? Popř. jak?

Editoval popcorn (3. 9. 2019 17:25)

Kamil Valenta
Člen | 822
+
+3
-

No a proč je to formulář? Proč to není jen odkaz na actionu / handle s parametrem?

public function handleRemoveUser($id)
{
    $this->settingsManager->removeUser($id);
    $this->redirect(':Default');
}

<a n:href="RemoveUser! id=> $user['id']">Remove</a>

Editoval kamil_v (3. 9. 2019 22:19)

jiri.pudil
Nette Blogger | 1032
+
-1
-

Ahoj, s formulářem to budeš mít jednodušší; pokud jich má být víc, můžeš si pomoci Multiplierem. Jinak formulář je sémanticky rozhodně lepší volba než odkaz, protože kliknutí na odkaz standardně vyvolá GET request a GET request vůbec nemá co ovlivňovat (mazat) data.

Kamil Valenta
Člen | 822
+
+1
-

To se mi zdá trochu teoretické. Obdobně lze říci, že formulář vyvolá request POST, který také nemá mazat data. A že by někdo vytvářel hlavičku DELETE (mimo API), o tom nevím. Dost běžně se odkazem maže, pro příklad nemusíme daleko, zdejší forum je jedním z mnoha příkladů.

Ale nic to nemění na tom, že by to formem nešlo. Jen se tazatel ptal, zda na to form potřebuje. Úplně nevidím, v čem je to s formem jednodušší, pokud bych ho ještě měl vykreslovat přes multiplier… Textový odkaz vyřeším foreachem v šabloně…

Šaman
Člen | 2667
+
+4
-

Řešil bych to tak, že si běžný odkaz nastyluju jako tlačítko a žádný formulář tam nebude.

Editoval Šaman (4. 9. 2019 17:58)

popcorn
Člen | 28
+
+2
-

Díky kamil_v ^, netušil jsem, že do <a> jde vložit přímo takto hodnota, která se bude posílat. Udělám to tak. Ten formulář je zajímavý, ale zdá se mi zbytečné dělat formulář, když chci jen „tlačítko“.

jiri.pudil
Nette Blogger | 1032
+
+1
-

To se mi zdá trochu teoretické. Obdobně lze říci, že formulář vyvolá request POST, který také nemá mazat data.

Jasně že je to hodně akademické a ano, ani POST není sémanticky ideální, ale pořád mi připadá lepší než GET: GET má být z definice idempotentní, bez specifičtějšího nastavení se běžně kešuje v prohlížečích, případně ho může zakešovat třeba reverzní proxy nebo jiný prvek po cestě v síti, a to jsou věci, které pro akce měnící stav nejsou úplně žádoucí. Před Nette 3.0 se taky snáz řešila ochrana proti CSRF u formuláře než u odkazu. A další věc je přístupnost, z pohledu které jsou odkaz a tlačítko dvě odlišné věci s odlišnou funkcí a <a role="button"> mi ve chvíli, kdy můžu použít skutečné tlačítko, připadá jako workaround.

Ale uznávám, že formulář je hodně psaní navíc. Jen jsem chtěl nabídnout alternativní pohled a asi jsem málo popsal motivaci, což teď snad napravuji :) Nakonec je to o tom, kde chceš udělat trade-off, a u takového rozhodnutí se mi zdá dobré vědět, proč to dělám a jaké to může mít důsledky.

Šaman
Člen | 2667
+
0
-

jiri.pudil:
Nebudeš mít <a role="button">, ale obyčejný odkaz, který opticky vypadá, jako tlačítko. V případě CSS bootstrapu třeba <a class="btn">. Tohle není věc sémantiky a návrhu html, ale pouze vzhledu.

A ohledně toho, jestli je lepší použít formulář – v případě, že nepotřebuji žádny vstup od uživatele, tak nevidím důvod používat formulář. Bavíme se třeba o tlačítkách „upravit“ a „vymazat“ v gridech (nebo tady pod každým příspěvkem). Nebo más na mysli jiné případy?

Editoval Šaman (5. 9. 2019 13:54)