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):

1class InfoType extends AbstractType
2{
3    public function buildForm(FormBuilderInterface $builder, array $options)
4    {
5        $builder
6            ->add('jmeno')
7            ->add('prijmeni')
8            /* tady bych například potřeboval vložit nějaký HTML kód */
9            ->add('email')  /* Případně i nějaký HTML kód dovnitř struktury elementu form-group */
10            ->add('telefon')
11        ;
12    }
13 }   
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:

1          {% form_theme info_form 'bootstrap_4_layout.html.twig' %}
2                {{ form_start(info_form, {'attr': {'id': 'form-info','class': 'form-inline'}}) }}
3 
4 
5                {{ form_end(info_form) }}
          {% 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:

1<div class="form-group">
2<input type="text" id="info_jmeno" name="info[jmeno]" />
3<label for="info_jmeno">Jméno</label>
4</div>
<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ě:

1{{ form_start(form) }}
2    {{ form_errors(form) }}
3 
4    <div class="policko">
5        {{ form_label(form.jmeno) }} <!-- popisek pole -->
6        {{ form_widget(form.jmeno) }} <!-- samotný input -->
7        <small>{{ form_help(form.jmeno) }}</small> <!-- nápověda -->
8        {{ form_errors(form.jmeno) }} <!-- chyby validace -->
9    </div>
10 
11    <!-- a tak dále pro ostatní pole -->
12 
13{{ form_end(form) }}
{{ 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:

1{{ form_start(form) }}
2    {{ form_errors(form) }}
3 
4    {{ form_row(form.jmeno) }}
5    <!-- sem klidně nejaké další HTML -->
6    {{ form_row(form.prijmeni) }}
7    <!-- … -->
8 
9{{ form_end(form) }}
{{ 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.
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.

Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:


Běda vám, jestli to bude blábol.

0