Symfony - Formulir

Symfony menyediakan berbagai tag bawaan untuk menangani formulir HTML dengan mudah dan aman. Komponen Formulir Symfony melakukan proses pembuatan dan validasi formulir. Ini menghubungkan model dan lapisan tampilan. Ini menyediakan satu set elemen formulir untuk membuat formulir html lengkap dari model yang telah ditentukan sebelumnya. Bab ini menjelaskan tentang Formulir secara detail.

Bidang Formulir

API kerangka kerja Symfony mendukung sekelompok besar jenis bidang. Mari kita bahas setiap jenis bidang secara mendetail.

FormType

Ini digunakan untuk menghasilkan formulir dalam kerangka Symfony. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\EmailType; 
use Symfony\Component\Form\Extension\Core\Type\FormType; 
// ...  

$builder = $this->createFormBuilder($studentinfo); 
$builder 
   ->add('title', TextType::class);

Ini, $studentinfo adalah entitas bertipe Student. createFormBuilderdigunakan untuk membuat formulir HTML. menambahkan metode digunakan untukadd elemen masukan di dalam formulir. title mengacu pada properti gelar siswa. TextType::classmengacu pada bidang teks html. Symfony menyediakan kelas untuk semua elemen html.

TextType

Bidang TextType mewakili bidang teks input paling dasar. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\TextType; 
$builder->add(‘name’, TextType::class);

Di sini, nama dipetakan dengan entitas.

TextareaType

Merender elemen HTML textarea. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\TextareaType; 
$builder->add('body', TextareaType::class, array( 
   'attr' => array('class' => 'tinymce'), 
));

EmailType

Bidang EmailType adalah bidang teks yang dirender menggunakan tag email HTML5. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\EmailType; 
$builder->add('token', EmailType::class, array( 
   'data' => 'abcdef', ));

PasswordType

Bidang PasswordType menampilkan kotak teks kata sandi masukan. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\PasswordType; 
$bulder->add('password', PasswordType::class);

RangeType

Bidang RangeType adalah penggeser yang ditampilkan menggunakan tag rentang HTML5. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\RangeType; 
// ...  
$builder->add('name', RangeType::class, array( 
   'attr' => array( 
      'min' => 100, 
      'max' => 200 
   ) 
));

PercentType

PercentType merender bidang teks input dan mengkhususkan diri dalam menangani data persentase. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\PercentType; 
// ... 
$builder->add('token', PercentType::class, array( 
   'data' => 'abcdef', 
));

DateType

Membuat format tanggal. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\DateType; 
// ... 
$builder->add(‘joined’, DateType::class, array( 
   'widget' => 'choice', 
));

Di sini, Widget adalah cara dasar untuk merender bidang.

Ini melakukan fungsi berikut.

  • choice- Membuat tiga input pemilihan. Urutan pilihan ditentukan dalam opsi format.

  • text - Merender tiga field input teks tipe (bulan, hari, tahun).

  • single_text- Membuat satu masukan dari tanggal jenis. Masukan pengguna divalidasi berdasarkan opsi format.

CheckboxType

Membuat kotak centang masukan tunggal. Ini harus selalu digunakan untuk bidang yang memiliki nilai boolean. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\CheckboxType; 
// ...  
$builder-<add(‘sports’, CheckboxType::class, array( 
   'label'    =< ‘Are you interested in sports?’, 
   'required' =< false, 
));

RadioType

Membuat satu tombol radio. Jika tombol radio dipilih, bidang akan disetel ke nilai yang ditentukan. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\RadioType; 
// ...  
$builder->add('token', RadioType::class, array( 
   'data' => 'abcdef', 
));

Perhatikan bahwa, tombol Radio tidak dapat dihapus centangnya, nilainya hanya berubah ketika tombol radio lain dengan nama yang sama dicentang.

RepeatType

Ini adalah "grup" bidang khusus, yang membuat dua bidang identik yang nilainya harus cocok. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\RepeatedType; 
use Symfony\Component\Form\Extension\Core\Type\PasswordType; 

// ...  
$builder->add('password', RepeatedType::class, array( 
   'type' => PasswordType::class, 
   'invalid_message' => 'The password fields must match.', 
   'options' => array('attr' => array('class' => 'password-field')), 
   'required' => true, 
   'first_options'  => array('label' => 'Password'), 
   'second_options' => array('label' => 'Repeat Password'), 
));

Ini sebagian besar digunakan untuk memeriksa kata sandi atau email pengguna.

ButtonType

Tombol sederhana yang dapat diklik. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\ButtonType; 
// ...  
$builder->add('save', ButtonType::class, array(
   'attr' => array('class' => 'save'), 
));

ResetType

Tombol yang menyetel ulang semua bidang ke nilai awalnya. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\ResetType; 
// ...  
$builder->add('save', ResetType::class, array( 
   'attr' => array('class' => 'save'), 
));

ChoiceType

Bidang multiguna digunakan untuk memungkinkan pengguna "memilih" satu atau lebih opsi. Ini dapat diberikan sebagai tag pilih, tombol radio, atau kotak centang. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
// ...  
$builder->add(‘gender’, ChoiceType::class, array( 
   'choices'  => array( 
      ‘Male’ => true, 
      ‘Female’ => false, 
   ), 
));

SubmitType

Tombol kirim digunakan untuk mengirimkan data formulir. Sintaksnya adalah sebagai berikut -

use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
// ...  
$builder->add('save', SubmitType::class, array( 
   'attr' => array('class' => 'save'), 
))

Fungsi Pembantu Formulir

Fungsi pembantu formulir adalah fungsi ranting yang digunakan untuk membuat formulir dengan mudah di templat.

form_start

Mengembalikan tag formulir HTML yang mengarah ke tindakan, rute, atau URL yang valid. Sintaksnya adalah sebagai berikut -

{{ form_start(form, {'attr': {'id': 'form_person_edit'}}) }}

form_end

Menutup tag formulir HTML yang dibuat menggunakan form_start. Sintaksnya adalah sebagai berikut -

{{ form_end(form) }}

textarea.dll

Mengembalikan tag textarea, secara opsional dibungkus dengan editor JavaScript teks kaya sebaris.

kotak centang

Mengembalikan tag masukan yang sesuai dengan XHTML dengan type = "checkbox". Sintaksnya adalah sebagai berikut -

echo checkbox_tag('choice[]', 1);  
echo checkbox_tag('choice[]', 2);  
echo checkbox_tag('choice[]', 3);  
echo checkbox_tag('choice[]', 4);

input_password_tag

Mengembalikan tag input yang sesuai dengan XHTML dengan type = "password". Sintaksnya adalah sebagai berikut -

echo input_password_tag('password');  
echo input_password_tag('password_confirm');

input_tag

Mengembalikan tag masukan yang sesuai dengan XHTML dengan type = "text". Sintaksnya adalah sebagai berikut -

echo input_tag('name');

label

Mengembalikan tag label dengan parameter tertentu.

tombol radio

Mengembalikan tag masukan yang sesuai dengan XHTML dengan type = "radio". Sintaksnya adalah sebagai berikut -

echo ' Yes '.radiobutton_tag(‘true’, 1);  
echo ' No '.radiobutton_tag(‘false’, 0);

reset_tag

Mengembalikan tag masukan yang sesuai dengan XHTML dengan type = "reset". Sintaksnya adalah sebagai berikut -

echo reset_tag('Start Over');

Pilih

Menampilkan tag pilihan yang diisi dengan semua negara di dunia. Sintaksnya adalah sebagai berikut -

echo select_tag(
   'url', options_for_select($url_list), 
   array('onChange' => 'Javascript:this.form.submit();'));

Kirimkan

Mengembalikan tag masukan yang sesuai dengan XHTML dengan type = "submit". Sintaksnya adalah sebagai berikut -

echo submit_tag('Update Record');

Di bagian selanjutnya, kita akan mempelajari cara membuat formulir menggunakan kolom formulir.

Aplikasi Formulir Siswa

Mari buat formulir detail Siswa sederhana menggunakan bidang Formulir Symfony. Untuk melakukan ini, kita harus mematuhi langkah-langkah berikut -

Langkah 1: Buat Aplikasi Symfony

Buat aplikasi Symfony, formsample, menggunakan perintah berikut.

symfony new formsample

Entitas biasanya dibuat di bawah direktori “src / AppBundle / Entity /“.

Langkah 2: Buat Entitas

Buat file "StudentForm.php" di bawah direktori "src / AppBundle / Entity /". Tambahkan perubahan berikut pada file.

StudentForm.php

<?php 
namespace AppBundle\Entity;  

class StudentForm {    
   private $studentName; 
   private $studentId; 
   public $password; 
   private $address; 
   public $joined; 
   public $gender; 
   private $email; 
   private $marks; 
   public $sports;  
   
   public function getStudentName() { 
      return $this->studentName; 
   }  
   public function setStudentName($studentName) { 
      $this->studentName = $studentName; 
   }  
   public function getStudentId() { 
      return $this->studentId; 
   }  
   public function setStudentId($studentid) { 
      $this->studentid = $studentid; 
   }
   public function getAddress() { 
      return $this->address; 
   }  
   public function setAddress($address) { 
      $this->address = $address; 
   }  
   public function getEmail() { 
      return $this->email; 
   }  
   public function setEmail($email) { 
      $this->email = $email; 
   }  
   public function getMarks() { 
      return $this->marks; 
   }  
   public function setMarks($marks) { 
      $this->marks = $marks; 
   } 
}

Langkah 3: Tambahkan StudentController

Pindah ke direktori “src / AppBundle / Controller”, buat file “StudentController.php”, dan tambahkan kode berikut di dalamnya.

StudentController.php

<?php  
namespace AppBundle\Controller;  

use AppBundle\Entity\StudentForm; 
use AppBundle\Form\FormValidationType; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\DateType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\Extension\Core\Type\PasswordType; 
use Symfony\Component\Form\Extension\Core\Type\RangeType; 
use Symfony\Component\Form\Extension\Core\Type\EmailType; 
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; 
use Symfony\Component\Form\Extension\Core\Type\ButtonType; 
use Symfony\Component\Form\Extension\Core\Type\TextareaType; 
use Symfony\Component\Form\Extension\Core\Type\PercentType; 
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;  

class StudentController extends Controller {    
   /** 
      * @Route("/student/new") 
   */ 
   public function newAction(Request $request) {  
      $stud = new StudentForm(); 
      $form = $this->createFormBuilder($stud) 
         ->add('studentName', TextType::class)
         ->add('studentId', TextType::class) 
         ->add('password', RepeatedType::class, array( 
            'type' => PasswordType::class, 
            'invalid_message' => 'The password fields 
            must match.', 'options' => array('attr' => array('class' => 'password-field')), 
            'required' => true, 'first_options'  => array('label' => 'Password'), 
            'second_options' => array('label' => 'Re-enter'), 
         )) 
         
         ->add('address', TextareaType::class) 
         ->add('joined', DateType::class, array( 
               'widget' => 'choice', 
         )) 
            
         ->add('gender', ChoiceType::class, array( 
            'choices'  => array( 
               'Male' => true, 
               'Female' => false, 
            ), 
         )) 
         
         ->add('email', EmailType::class) 
         ->add('marks', PercentType::class) 
         ->add('sports', CheckboxType::class, array( 
            'label'    => 'Are you interested in sports?', 'required' => false, 
         )) 
         
         ->add('save', SubmitType::class, array('label' => 'Submit')) 
         ->getForm();  
         return $this->render('student/new.html.twig', array( 
            'form' => $form->createView(), 
         )); 
   } 
}

Langkah 4: Render Tampilan

Pindah ke direktori “app / Resources / views / student /“, buat file “new.html.twig” dan tambahkan perubahan berikut di dalamnya.

{% extends 'base.html.twig' %} 
{% block stylesheets %} 
<style> 
   #simpleform { 
      width:600px; 
      border:2px solid grey; 
      padding:14px; 
   }  
   #simpleform label { 
      font-size:14px; 
      float:left; 
      width:300px; 
      text-align:right; 
      display:block; 
   }  
   #simpleform span { 
      font-size:11px; 
      color:grey; 
      width:100px; 
      text-align:right; 
      display:block; 
   }  
   #simpleform input { 
      border:1px solid grey; 
      font-family:verdana; 
      font-size:14px;
      color:light blue; 
      height:24px; 
      width:250px; 
      margin: 0 0 10px 10px; 
   }  
   #simpleform textarea { 
      border:1px solid grey; 
      font-family:verdana; 
      font-size:14px; 
      color:light blue; 
      height:120px; 
      width:250px; 
      margin: 0 0 20px 10px; 
   }  
   #simpleform select { 
      margin: 0 0 20px 10px; 
   }  
   #simpleform button { 
      clear:both; 
      margin-left:250px; 
      background: grey; 
      color:#FFFFFF; 
      border:solid 1px #666666; 
      font-size:16px; 
   } 
</style> 

{% endblock %}  
   {% block body %} 
   <h3>Student details:</h3> 
   <div id="simpleform"> 
      {{ form_start(form) }} 
      {{ form_widget(form) }} 
      {{ form_end(form) }} 
   </div> 
{% endblock %}

Sekarang minta url, "http: // localhost: 8000 / student / new" dan itu menghasilkan hasil sebagai berikut.

Hasil