Langsung ke konten utama

Symfony 5 - Form

 Ketika membuat sistem menggunakan PHP, besar kemungkinan kita akan menggunakan form untuk menerima input. Namun menggunakan form akan sangat melelahkan karena kita akan menuliskan kode yang berulang-ulang seperti pembuatan input, validasi dll.Di Symfony kita disediakan component Form yang akan mempersingkat waktu kita dalam membangun sebuah sistem.

Untuk menggunakan komponen form, kita bisa melakukan instalasi dengan menggunakan composer:

composer require symfony/form

tunggu beberapa saat sampai proses instalasi selesai.

Penggunaan Form

Kita punya sebuah entity Task yang kita anggap sebagai representasi dari tabel task seperti kode berikut:
<?php

namespace App\Entity;

/**
 * Description of Task
 *
 * @author apple
 */
class Task {
    
    protected $task;
    
    protected $dueDate;

    public function getTask(): string
    {
        return $this->task;
    }

    public function setTask(string $task): void
    {
        $this->task = $task;
    }

    public function getDueDate(): ?\DateTime
    {
        return $this->dueDate;
    }

    public function setDueDate(?\DateTime $dueDate): void
    {
        $this->dueDate = $dueDate;
    }
}
pada class diatas, kita mempunyai 2 buah attribute yaitu task dan dueDate; Kemudian kita akan membuat form input untuk Entity tersebut yang berfungsi untuk menerima input dari user.
Kemudian kita akan membuat controller yang akan berisi kode untuk membuat object form dan melakukan render ke file twig dan mengembalikannya menjadi object response seperti kode berikut.
<?php

namespace App\Controller;

use App\Entity\Task;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Routing\Annotation\Route;

/**
 * Description of FormController
 * @Route("/task", name="task_")
 * @author apple
 */
class TaskController extends AbstractController 
{
    /**
     * @Route("/create", name="create")
     * @param Request $request
     * @return Response
     */
    public function create(Request $request):Response
    {
        $task = new Task();
        $form = $this->createFormBuilder($task)
                ->add('task', TextType::class)
                ->add('dueDate', DateType::class)
                ->getForm();
        // ----- kode untuk memproses form ---
        
        // kode untuk render ke file twig
    }
}
kode diatas merupakan kode untuk kita membuat object form yang nanti akan kita render di file twig. Kode di atas nampak bahwa kita menambahkan beberapa input menggunakan function ->add() yang di ikuti dengan nama attribute serta tipe inputnya. Pastikan nama attributenya sama persis dengan attribute yang ada di entity.

Render Form

Setelah kita membuat object form, kita siapkan file twig yang berfungsi melakukan parsing dari object form menjadi syntax html seperti kode berikut:
{% extends "base.html.twig" %}

{% block body %}
    {{ form_start(form) }}
    
    {{ form_widget(form) }}
    
    <button type="submit" value="1">
        Simpan
    </button>
    
    {{ form_end(form) }}
{% endblock %}
kemudian kita panggil file twig tadi di controller, sehingga controller kita menjadi seperti berikut.
<?php

namespace App\Controller;

use App\Entity\Task;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Routing\Annotation\Route;

/**
 * Description of FormController
 * @Route("/task", name="task_")
 * @author apple
 */
class TaskController extends AbstractController 
{
    /**
     * @Route("/create", name="create")
     * @param Request $request
     * @return Response
     */
    public function create(Request $request):Response
    {
        $task = new Task();
        $form = $this->createFormBuilder($task)
                ->add('task', TextType::class)
                ->add('dueDate', DateType::class)
                ->getForm();
        // ----- kode untuk memproses form ---
        
        // kode untuk render ke file twig
        return $this->render("task.html.twig", [
            "form" => $form->createView()
        ]);
    }
}
pada controller di atas, kita tambahkan kode untuk melakukan render file twig yang sudah kita buat untuk menjadi object response dengan parameter berisi object FormView yang kita peroleh dengan memanggil function $form->createView().

Memproses Form

Secara default, form yang dikirim akan mennunakan method POST. untuk menangkap / mengambil data yag kita kirim menggunakan form, kita modifikasi controller kita sebelumnya menjadi seperti berikut.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php

namespace App\Controller;

use App\Entity\Task;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Routing\Annotation\Route;

/**
 * Description of FormController
 * @Route("/task", name="task_")
 * @author apple
 */
class TaskController extends AbstractController 
{
    /**
     * @Route("/create", name="create")
     * @param Request $request
     * @return Response
     */
    public function create(Request $request):Response
    {
        $task = new Task();
        $form = $this->createFormBuilder($task)
                ->add('task', TextType::class)
                ->add('dueDate', DateType::class)
                ->getForm();
        
        // ----- kode untuk memproses form ---
        if (Request::METHOD_POST === $request->getMethod()) {
            $form->handleRequest($request);
            if ($form->isValid()) {
                $task = $form->getData();
                
                // kode untuk memproses data yang sudah di inputkan melalui form
                // seperti menyimpan ke database dll.
            }
            
            return $this->redirectToRoute("task_create");
        }
        
        // kode untuk render ke file twig
        return $this->render("task.html.twig", [
            "form" => $form->createView()
        ]);
    }
}
untuk memproses data yang kita kirim melalui form, kita fokus ke kode baris 34 sampai baris 44.
DIsana, jika method nya post, maka dijalankan function handleRequest() yang berfungsi untuk menangkap data yang dikirim dari request untuk di proses menjadi object Task. Kemudian isValid() untuk melakukan validasi apakah input yang kita kirim telah sesuai dengan rule validasi yang telah kita buat. Untuk validasi form akan kita bahas di tulisan selanjutnya. Kemudian untuk mengambil data yang sudah siap, kita bisa menggunakan function getData() yang nanti kita proses ke proses lain seperti simpan ke database dll.

Memisahkan Class Form Dari Controller

Kode sebelumnya kita sudah praktek membuat Controller beserta form. Namun cara ini kurang saya rekomendasikan karena Controller akan semakin panjang juga apabila kita akan membuat form yang sama di function / Controller yang lain, kita harus menukis ulang kode untuk membuat form. Karena itu disarankan untuk memisahkan antara Form Class dengan Controller. 
Buat Folder Form di src kemudian buat Class TaskType seperti kode berikut.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php // src/Form

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

/**
 * Description of TaskType
 *
 * @author apple
 */
class TaskType extends AbstractType 
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('task', TextType::class)
            ->add('dueDate', DateType::class)
        ;
    }
}
kemudian modifikasi Controller kita menjadi seperti berikut.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php

namespace App\Controller;

use App\Entity\Task;
use App\Form\TaskType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * Description of FormController
 * @Route("/task", name="task_")
 * @author apple
 */
class TaskController extends AbstractController 
{
    /**
     * @Route("/create", name="create")
     * @param Request $request
     * @return Response
     */
    public function create(Request $request):Response
    {
        $task = new Task();
        $form = $this->createForm(TaskType::class, $task);
        
        // ----- kode untuk memproses form ---
        if (Request::METHOD_POST === $request->getMethod()) {
            $form->handleRequest($request);
            if ($form->isValid()) {
                $task = $form->getData();
                
                // kode untuk memproses data yang sudah di inputkan melalui form
                // seperti menyimpan ke database dll.
            }
            
            return $this->redirectToRoute("task_create");
        }
        
        // kode untuk render ke file twig
        return $this->render("task.html.twig", [
            "form" => $form->createView()
        ]);
    }
}
Fokus di kode baris 27. kode kita sebelumnya yang membuat object form secara manual, kali ini kita buat object form dari class TaskType.

Selanjutnya

ini adalah tulisan awal seri belajar form di symfony. Pada tulisan selanjutnya kita akan menyelam lebih dalam untuk lebih mengenal Form di symfony

Komentar

Postingan populer dari blog ini

Contoh Perhitungan Algoritma Perceptron

      Melanjutkan tulisan saya sebelumnya tentang algoritma perceptron,kali ini saya akan menulis tentang conto perhitungan manual algoritma perceptron. Untuk contoh kasusnya saya menggunakan data logika AND. Cekidot.... Algoritma      Data yang kita gunakan sebagai contoh adalah data logika AND sebagai berikut: x1 x2 target 0 0 0 0 1 0 1 0 0 1 1 1       tentukan bobot awal secara acak, saya pakai contoh w1 = 0,w2 =0, learning rate = 1, bias = 0,maksimal epoh = 10. Disini saya memakai fungsi aktivasi undak biner. Epoh ke 1 Data ke satu x = {0,0}, bobot w = {0,0},b=0,target = 0 y_in = (x1*w1)+(x2*w2)+b = (0*0)+(0*0)+0 = 0 y = sign(0) = 1 karena y != target maka hitung error dan update bobot  error = target - y = 0 - 1 = -1 w1_baru = w1_lama +(learning_rate*error*x1)                = 0 ...

Contoh Perhitungan Algoritma Learning Vector Quantization

Melanjutkan tulisan saya tentang algoritma Learning Vector Quantization yang lalu, kali ini saya akan melanjutkan dengan contoh perhitungan manual. Berikut ini contoh data yang akan kita hitung. No X1 X2 X3 X4 target 1 0 1 1 0 0 2 0 0 1 1 1 3 1 1 1 1 0 4 1 0 0 1 1 pada contoh di atas, saya menggunakan 4 data sebagai data training beserta target yang bertujuan untuk mendapatkan bobot yang akan digunakan pada proses klasifikasi. Bobot awal adalah { 1, 1, 1, 0} dan { 1, 0, 1, 1} dengan learning rate 0,05 dengan fungsi pembelajaran = 0,1. Pelatihan Iterasi ke 1 1. Data ke 1 { 0, 1, 1, 0} dengan target 0, bobot = {{ 1, 1, 1, 0},{ 1, 0, 1, 1}}      - menghitung bobot untuk masing masing output :          kelas 0 = sqrt(((0-1)^2)+((1-1)^2)+((1-1)^2)+((0-...

Part 7 : Normalisasi Histogram

Menyambung tulisan saya yang sebelumnya tentang pengolahan citra khususnya histogram,kali ini saya lanjutkan tentang Normalisasi histogram.Sebelumnya saya harap agan sudah mengerti tentang histogram.Jika belum bisa di baca dulu di tulisan saya sebelumnya di sini . Normalisasi Histogram adalah menskalakan nilai piksel secara linear untuk menggunakan secara penuh jangkauan yang tersedia. Rumus :  Keterangan : n k= nilai grayscale dari piksel ke k(k = 0,1,2,3....) min = nilai grayscale terkecil yang diperoleh dari histogram max = nilai grayscale terbesar L = range nilai grayscale citra Contoh perhitungan : dari tabel di atas,nilai min adalah 2 yaitu nilai grayscale terkecil dari citra dan max adalah 5 s = 0 - 2 /5 - 2 =0 (untuk n = 0)  hasil = 0 x 7(nilai maksimal grayscale) = 0 sk = 3 - 2 /5 - 2 = 0.333  (untuk n = 3) hasil = 0.333 x 7 = 2 keterangan : 7 adalah range grayscale dari citra,dan untuk banyak kasus biasanya memakai 255. Tujuan Normalisasi...