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: 4 roky
|
0