| Autor | Zpráva | ||
|---|---|---|---|
| quatzael Profil |
#1 · Zasláno: 5. 10. 2020, 20:35:26
Ahoj,
měl bych dva dotazy ohledně tvorby formulářů v Symfony 5: 1. GET formulář Mám jednoduchý formulář, který se má odeslat metodou GET. Problém je ten, že Symfony pořád nastavuje atribut name jako pole. Tzn. např. místo jednoduchého name="id", to vždycky vyrenderuje takto: name="form[id]".
Mě je to principiálně celkem jedno, jenže to po odeslání dělá hnusnou, nepřehlednou a dlouhou URL: /?form%5Bid%5D=159
Je nějaký "normální" způsob jak to obejít? 2. Potřeboval bych do formuláře mezi jednotlivé inputy nějak flexibilně přidávat HTML elementy. Mám vytvořenou třídu (FormType): class InfoType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('jmeno')
->add('prijmeni')
/* tady bych například potřeboval vložit nějaký HTML kód */
->add('email') /* Případně i nějaký HTML kód dovnitř struktury elementu form-group */
->add('telefon')
;
}
} Ve twigu mám jednoduše tento kód: {% form_theme info_form 'bootstrap_4_layout.html.twig' %}
{{ form_start(info_form, {'attr': {'id': 'form-info','class': 'form-inline'}}) }}
{{ form_end(info_form) }}A vytváří to takovouto strukturu: <div class="form-group"> <input type="text" id="info_jmeno" name="info[jmeno]" /> <label for="info_jmeno">Jméno</label> </div> Toto je samozřejmě jen příklad. Ale když mám v třídě InfoType takto nadefinovaných třeba 50 inputů a chci pouze mezi některé (nebo k některým) vložit část HTML kódu, jakým jednoduchým způsobem je toto možné provést?
Děkuji. |
||
| Kcko Profil |
#2 · Zasláno: 5. 10. 2020, 22:26:43
quatzael:
Zlatý Nette, od kterýho si utekl ;-) Proč se ptáš tady a ne na fóru pro Symfony? |
||
| quatzael Profil |
#3 · Zasláno: 6. 10. 2020, 01:44:57
Kcko:
Hmm ok. Mohl bys teda prosím aspoň uvést link na to tajné Symfony forum, které nejde ani vygooglit? Fyi, já jsem nikdy u Nette naštěstí nebyl, takže ani není odkud utíkat.. :o) |
||
| Ikki Profil |
#4 · Zasláno: 6. 10. 2020, 02:34:55
quatzael:
symfony.com/community |
||
| Firibix Profil |
#5 · Zasláno: 6. 10. 2020, 09:36:05
Reakce na quatzaela:
Buď si můžeš napsat úplně vlastní šablonu pro renderování formulářů, nebo vykreslovat políčka toho konkrétního formuláře ručně: {{ form_start(form) }}
{{ form_errors(form) }}
<div class="policko">
{{ form_label(form.jmeno) }} <!-- popisek pole -->
{{ form_widget(form.jmeno) }} <!-- samotný input -->
<small>{{ form_help(form.jmeno) }}</small> <!-- nápověda -->
{{ form_errors(form.jmeno) }} <!-- chyby validace -->
</div>
<!-- a tak dále pro ostatní pole -->
{{ form_end(form) }}Pokud by byla až takhle velká manuální kontrola overkill, můžeš nechat šablonu vykreslit to, co je uvnitř výše uvedeného div.policko automaticky, a případně mezi jednotlivé inputy vkládat další kód:
{{ form_start(form) }}
{{ form_errors(form) }}
{{ form_row(form.jmeno) }}
<!-- sem klidně nejaké další HTML -->
{{ form_row(form.prijmeni) }}
<!-- … -->
{{ form_end(form) }}Viz dokumentace Symfony. Reakce na Kcka: Ptáš se tazatelů v kategorii Databáze na webu, proč se neptají na fóru MySQL? |
||
| quatzael Profil |
#6 · Zasláno: 7. 10. 2020, 10:18:15
Firibix:
Ok, díky za odpověď. Přes ten Twig to upravovat docela jde. Kromě toho problému s tou metodou GET, ale to je menší formulář, takže to když tak udělám úplně manuálně.. |
||
| Amunak Profil |
#7 · Zasláno: 7. 10. 2020, 11:27:11
quatzael:
> Symfony pořád nastavuje atribut name jako pole. Tzn. např. místo jednoduchého name="id", to vždycky vyrenderuje takto: name="form[id]".
> Mě je to principiálně celkem jedno, jenže to po odeslání dělá hnusnou, nepřehlednou a dlouhou URL: /?form%5Bid%5D=159
> Je nějaký "normální" způsob jak to obejít? Tohle je feature která Symfony umožňuje formulář vůbec zpracovat. Je to obecně best practice u PHP formulářů - jdou pak z $_GET / $_POST „vytáhnout“ jednoduše přes jediný klíč ($_GET['form_name']) a jde tak třeba detekovat zda se odeslalo více polí než existuje v definici formuláře. Kdyby to bylo všechno rovnou v "rootu" těch přijatých proměnných, nefungovalo by to. Silně bych doporučil to takto nechat; nejlepší co s tím jde udělat je dát tomu formuláři name s jediným znakem. Většina prohlížečů stejně parametry v URL znevýrazňuje a běžný uživatel opravdu neřeší jestli tam je ?form[field]=hello nebo ?field=hello.
„2. Potřeboval bych do formuláře mezi jednotlivé inputy nějak flexibilně přidávat HTML elementy.“ Jen doplním: pokud se tvé úpravy netýkají pouze tohoto formuláře ale jde např. o integraci do frontendového frameworku bylo by vhodné použít nějaký Form Theme - buď existující (třeba pokud používáš Bootstrap) nebo vlastní. Tohle "manuální vykreslování" je vhodné pouze pokud jde o jednu samostatnou aplikaci takového formuláře. |
||
|
Časová prodleva: 5 let
|
|||
0