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 + (1*(-1)*0) = 0 w2_baru = w2_lama +(learning_rate*error*x2)                = 0+(1*(-1)*0) = 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-0)^2)) = 1         kelas 1 = sqrt(((0-1)^2)+((1-0)^2)+((1-

Pemrograman Berorientasi Object - Overloading dan Overriding

       Function atau method overloading dan override adalah fitur yang sangat mendasar dan berguna dari bahasa OOP manapun. Dalam tutorial ini kita akan membahas implementasi metode overloading dan override di php. Di sini pertama kita akan membahas dasar-dasar overloading dan override. Setelah eksplorasi dasar kita akan menerapkan overloading dan override di php. Sebelum melangkah lebih jauh, saya mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang class dan pewarisan di php. Anda juga memiliki pemahaman tentang magic method di php. Magic method karena overloading di php bisa di implmentasikan dengan menggunakan magic method. Overriding        Arti dasar dari overriding di OOP sama dengan arti kata sebenarnya. Dalam arti kata sebenarnya dari overriding adalah menggantikan perilaku orang tua yang sama pada anak. Ini sama dengan override method di OOP. Dalam arti OOP, override adalah mengganti method class induk di class anak. Atau dengan method kata kunci sederhana yang me