SyMfonAK - vyvíjame databázy pomocou frameworku Symfony

Symfony 3 formulár

Z SyMfonAK
Prejsť na: navigácia, hľadanie

Symfony dokumentácia → Symfony 3 formulár


originál dokumentácia
  • Najčastejšie robíme formulár pre nejakú tabuľku v databáze, preto najprv treba mať definovanú Entitu.

Jednoduchý formulár

Vytvorenie formulára priamo kontrolérom

Príklad: formulár pre nový záznam.

  • načítame meno entity pre ktorú pripravujeme formulár
  • štandardom je využiť základný Bundle dodaný so Symfony: use Symfony\Bundle\FrameworkBundle\Controller\Controller; a rozšíriť class
  • budeme pracovať s Request-om, preto načítame potrebný komponent use Symfony\Component\HttpFoundation\Request;
  • vytvoríme public funkciu newAction()
    • založíme nový záznam entity
    • definujeme pre entitu formulár pomocou FormBuilder-a, pridáme každú položku
    • pre každý typ použitej položky formulára natiahneme potrebný komponent, napríklad use Symfony\Component\Form\Extension\Core\Type\DateType;...
    • formulár necháme zobraziť v šablóne new.html.twig a zobrazíme príkazom $form->createView()


nameSpace AppBundle\Controller;

use AppBundle\Entity\MojaEntity.php;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class DefaultController extends Controller
{
  public function newAction(Request $request)
  {
    $novyZaznam = new MojaEntita();
    
    $form = $this->createFormBuilder($novyZaznam)
      ->add('textovaPolozka', TextType::class)
      ->add('datumovaPolozka', DateType::class)
      ->add('save', SubmitType::class, array('label' => 'Ulož nový záznam'))
      ->getForm();

     return $this->render('default/new.html.twig', array(
            'form' => $form->createView(),
     ));
  }

}
.

Stvárnenie formulára (rendering)

Spracovanie odoslaného formulára

Validácia formulára

Predpripravené typy položiek

Textové položky


Položky pre voľbu

Dátumové a časové položky

Ostatné položky

Skupiny položiek

Skryté položky

Tlačidlá

Základné položky

Voliteľné parametre

Odhad typu položky

Parametre

Odporúčané! Formulár ako samostatná trieda (Form Classes)

  • pre všetky formuláre si založíme nový adresár src/AppBundle/Form a vždy definujeme na začiatku vlastnej triedy formulára nameSpace AppBundle\Form;.
  • všetky názvy súborov formulárových tried budú mať sufix ..Type.php
  • na rozdiel od priamej tvorby v kontrolér-y (viď vyššie), využijeme:
    • use Symfony\Component\Form\AbstractType; aby sme využili túto triedu class MojformType extends AbstractType
    • use Symfony\Component\Form\FormBuilderInterface;
  • z "..\Form\Extensions\Core\.." si necháme len Submit use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  • vytvoríme funkciu buildForm využívajúcu FormBuilderInterface a očakávajúcu pole parametrov $options
  • dobrá prax (pri embedding form nutnosť) je definovať data_class ..ktorej entity sa týka formulár
    • treba využiť OptionsResolver.. use Symfony\Component\OptionsResolver\OptionsResolver;
    • vytvoríme funkciu
// src/AppBundle/Form/MojformType.php

nameSpace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

use AppBundle\Entity\MojaEntity.php;
use Symfony\Component\OptionsResolver\OptionsResolver;


class MojformType extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder, array $options)
  {
   $builder
            ->add('task')
            ->add('dueDate', null, array('widget' => 'single_text'))
            ->add('save', SubmitType::class)
        ;
  }

  public function configureOptions(OptionsResolver $resolver)
  {
    $resolver->setDefaults(array(
        'data_class' => MojaEntity::class,
    ));
  }
}


Kontrolér využíva formulárovú triedu takto:

  • využije form triedu use AppBundle\Form\MojformType;
  • namiesto "$form = $this->createFormBuilder($novyZaznam)..." definuje formulár takto: $form = $this->createForm(MojformType::class, $novyZaznam);


// src/AppBundle/Controller/DefaultController.php
use AppBundle\Form\MojformType;

public function newAction()
{
    $novyZaznam = ...;
    $form = $this->createForm(MojformType::class, $novyZaznam);

    // ...
}

Myšlienky na záver

Naučte sa viac

Súvisiace témy