Symfony - แบบฟอร์ม
Symfony มีแท็กในตัวที่หลากหลายเพื่อจัดการกับรูปแบบ HTML ได้อย่างง่ายดายและปลอดภัย ส่วนประกอบฟอร์มของ Symfony ดำเนินการสร้างแบบฟอร์มและกระบวนการตรวจสอบความถูกต้อง มันเชื่อมต่อโมเดลและเลเยอร์มุมมอง จัดเตรียมชุดขององค์ประกอบฟอร์มเพื่อสร้างแบบฟอร์ม html ที่สมบูรณ์จากโมเดลที่กำหนดไว้ล่วงหน้า บทนี้จะอธิบายเกี่ยวกับแบบฟอร์มโดยละเอียด
แบบฟอร์มฟิลด์
Symfony framework API รองรับประเภทฟิลด์กลุ่มใหญ่ มาดูรายละเอียดของฟิลด์แต่ละประเภทกัน
FormType
ใช้เพื่อสร้างฟอร์มในเฟรมเวิร์ก Symfony ไวยากรณ์มีดังนี้ -
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);
ที่นี่ $studentinfo เป็นเอนทิตีประเภท Student createFormBuilderใช้เพื่อสร้างฟอร์ม HTML ใช้วิธีการเพิ่มเพื่อadd องค์ประกอบการป้อนข้อมูลภายในแบบฟอร์ม title หมายถึงคุณสมบัติของนักเรียน TextType::classหมายถึงฟิลด์ข้อความ html Symfony มีคลาสสำหรับองค์ประกอบ html ทั้งหมด
TextType
ฟิลด์ TextType แสดงถึงฟิลด์ข้อความอินพุตพื้นฐานที่สุด ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\TextType;
$builder->add(‘name’, TextType::class);
ที่นี่ชื่อจะถูกจับคู่กับเอนทิตี
TextareaType
แสดงผลองค์ประกอบ HTML textarea ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
$builder->add('body', TextareaType::class, array(
'attr' => array('class' => 'tinymce'),
));
EmailType
ฟิลด์ EmailType คือฟิลด์ข้อความที่แสดงผลโดยใช้แท็กอีเมล HTML5 ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\EmailType;
$builder->add('token', EmailType::class, array(
'data' => 'abcdef', ));
PasswordType
ฟิลด์ PasswordType จะแสดงกล่องข้อความรหัสผ่านที่ป้อน ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
$bulder->add('password', PasswordType::class);
RangeType
ฟิลด์ RangeType คือแถบเลื่อนที่แสดงผลโดยใช้แท็กช่วง HTML5 ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\RangeType;
// ...
$builder->add('name', RangeType::class, array(
'attr' => array(
'min' => 100,
'max' => 200
)
));
PercentType
PercentType แสดงผลฟิลด์ข้อความป้อนและเชี่ยวชาญในการจัดการข้อมูลเปอร์เซ็นต์ ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\PercentType;
// ...
$builder->add('token', PercentType::class, array(
'data' => 'abcdef',
));
DateType
แสดงรูปแบบวันที่ ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\DateType;
// ...
$builder->add(‘joined’, DateType::class, array(
'widget' => 'choice',
));
นี่วิดเจ็ตเป็นวิธีพื้นฐานในการแสดงผลฟิลด์
ทำหน้าที่ดังต่อไปนี้
choice- แสดงสามอินพุตที่เลือก ลำดับของการเลือกถูกกำหนดไว้ในตัวเลือกรูปแบบ
text - แสดงการป้อนข้อความประเภทสามช่อง (เดือนวันปี)
single_text- แสดงการป้อนข้อมูลประเภทวันที่เดียว อินพุตของผู้ใช้ได้รับการตรวจสอบความถูกต้องตามตัวเลือกรูปแบบ
CheckboxType
สร้างช่องทำเครื่องหมายอินพุตเดียว ควรใช้สำหรับฟิลด์ที่มีค่าบูลีนเสมอ ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
// ...
$builder-<add(‘sports’, CheckboxType::class, array(
'label' =< ‘Are you interested in sports?’,
'required' =< false,
));
RadioType
สร้างปุ่มตัวเลือกเดียว หากเลือกปุ่มตัวเลือกฟิลด์จะถูกตั้งค่าเป็นค่าที่ระบุ ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\RadioType;
// ...
$builder->add('token', RadioType::class, array(
'data' => 'abcdef',
));
โปรดทราบว่าไม่สามารถยกเลิกการเลือกปุ่มวิทยุได้ค่าจะเปลี่ยนแปลงก็ต่อเมื่อมีการตรวจสอบปุ่มตัวเลือกอื่นที่มีชื่อเดียวกัน
RepeatType
นี่คือฟิลด์พิเศษ "กลุ่ม" ที่สร้างฟิลด์ที่เหมือนกันสองฟิลด์ซึ่งค่าต้องตรงกัน ไวยากรณ์มีดังนี้ -
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'),
));
ส่วนใหญ่จะใช้เพื่อตรวจสอบรหัสผ่านหรืออีเมลของผู้ใช้
ButtonType
ปุ่มที่คลิกได้ง่ายๆ ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
// ...
$builder->add('save', ButtonType::class, array(
'attr' => array('class' => 'save'),
));
ResetType
ปุ่มที่รีเซ็ตฟิลด์ทั้งหมดเป็นค่าเริ่มต้น ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\ResetType;
// ...
$builder->add('save', ResetType::class, array(
'attr' => array('class' => 'save'),
));
ChoiceType
ช่องอเนกประสงค์ใช้เพื่อให้ผู้ใช้ "เลือก" ตัวเลือกหนึ่งตัวเลือกขึ้นไป สามารถแสดงเป็นแท็กเลือกปุ่มตัวเลือกหรือช่องทำเครื่องหมาย ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...
$builder->add(‘gender’, ChoiceType::class, array(
'choices' => array(
‘Male’ => true,
‘Female’ => false,
),
));
SubmitType
ปุ่มส่งใช้ในการส่งแบบฟอร์มข้อมูล ไวยากรณ์มีดังนี้ -
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
// ...
$builder->add('save', SubmitType::class, array(
'attr' => array('class' => 'save'),
))
ฟังก์ชันตัวช่วยฟอร์ม
ฟังก์ชันตัวช่วยฟอร์มเป็นฟังก์ชันกิ่งไม้ที่ใช้สร้างฟอร์มในเทมเพลตได้อย่างง่ายดาย
form_start
ส่งคืนแท็กรูปแบบ HTML ที่ชี้ไปยังการดำเนินการเส้นทางหรือ URL ที่ถูกต้อง ไวยากรณ์มีดังนี้ -
{{ form_start(form, {'attr': {'id': 'form_person_edit'}}) }}
form_end
ปิดแท็กฟอร์ม HTML ที่สร้างโดยใช้ form_start ไวยากรณ์มีดังนี้ -
{{ form_end(form) }}
textarea
ส่งคืนแท็ก textarea ซึ่งเป็นทางเลือกที่จะห่อด้วยโปรแกรมแก้ไข JavaScript แบบ Rich-text
ช่องทำเครื่องหมาย
ส่งคืนแท็กอินพุตที่เข้ากันได้กับ XHTML พร้อม type =“ checkbox” ไวยากรณ์มีดังนี้ -
echo checkbox_tag('choice[]', 1);
echo checkbox_tag('choice[]', 2);
echo checkbox_tag('choice[]', 3);
echo checkbox_tag('choice[]', 4);
input_password_tag
ส่งคืนแท็กอินพุตที่เข้ากันได้กับ XHTML พร้อม type =“ password” ไวยากรณ์มีดังนี้ -
echo input_password_tag('password');
echo input_password_tag('password_confirm');
input_tag
ส่งคืนแท็กอินพุตที่สอดคล้องกับ XHTML พร้อม type =“ text” ไวยากรณ์มีดังนี้ -
echo input_tag('name');
ฉลาก
ส่งคืนป้ายกำกับด้วยพารามิเตอร์ที่ระบุ
radiobutton
ส่งคืนแท็กอินพุตที่สอดคล้องกับ XHTML พร้อม type =“ radio” ไวยากรณ์มีดังนี้ -
echo ' Yes '.radiobutton_tag(‘true’, 1);
echo ' No '.radiobutton_tag(‘false’, 0);
reset_tag
ส่งคืนแท็กอินพุตที่เข้ากันได้กับ XHTML โดยมี type =“ reset” ไวยากรณ์มีดังนี้ -
echo reset_tag('Start Over');
เลือก
ส่งคืนแท็กที่เลือกซึ่งมีข้อมูลทุกประเทศในโลก ไวยากรณ์มีดังนี้ -
echo select_tag(
'url', options_for_select($url_list),
array('onChange' => 'Javascript:this.form.submit();'));
ส่ง
ส่งคืนแท็กอินพุตที่เข้ากันได้กับ XHTML พร้อม type =“ submit” ไวยากรณ์มีดังนี้ -
echo submit_tag('Update Record');
ในส่วนถัดไปเราจะเรียนรู้วิธีการสร้างแบบฟอร์มโดยใช้ฟิลด์แบบฟอร์ม
ใบสมัครนักศึกษา
มาสร้างแบบฟอร์มรายละเอียดของนักเรียนอย่างง่ายโดยใช้ฟิลด์ Symfony Form ในการดำเนินการนี้เราควรปฏิบัติตามขั้นตอนต่อไปนี้ -
ขั้นตอนที่ 1: สร้างแอปพลิเคชัน Symfony
สร้างแอปพลิเคชัน Symfony formsampleโดยใช้คำสั่งต่อไปนี้
symfony new formsample
โดยปกติเอนทิตีจะถูกสร้างขึ้นภายใต้ไดเร็กทอรี“ src / AppBundle / Entity /“
ขั้นตอนที่ 2: สร้างเอนทิตี
สร้างไฟล์“ StudentForm.php” ภายใต้ไดเร็กทอรี“ src / AppBundle / Entity /” เพิ่มการเปลี่ยนแปลงต่อไปนี้ในไฟล์
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;
}
}
ขั้นตอนที่ 3: เพิ่ม StudentController
ย้ายไปที่ไดเร็กทอรี“ src / AppBundle / Controller” สร้างไฟล์“ StudentController.php” และเพิ่มรหัสต่อไปนี้
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(),
));
}
}
ขั้นตอนที่ 4: แสดงมุมมอง
ย้ายไปที่ไดเร็กทอรี“ app / Resources / views / student /“ สร้างไฟล์“ new.html.twig” และเพิ่มการเปลี่ยนแปลงต่อไปนี้
{% 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 %}
ตอนนี้ขอ url“ http: // localhost: 8000 / student / new” และจะให้ผลลัพธ์ดังต่อไปนี้