Autor Zpráva
quatzael
Profil
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
quatzael:
Zlatý Nette, od kterýho si utekl ;-)
Proč se ptáš tady a ne na fóru pro Symfony?
quatzael
Profil
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
quatzael:
symfony.com/community
Firibix
Profil
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0