Учебники

Symfony — Формы

Symfony предоставляет различные встроенные теги для простой и безопасной обработки HTML-форм. Компонент Symfony Form выполняет процесс создания и проверки формы. Он соединяет модель и видовой слой. Он предоставляет набор элементов формы для создания полноценной HTML-формы из предопределенных моделей. Эта глава подробно объясняет формы.

Поля формы

API Symfony Framework поддерживает большую группу типов полей. Давайте подробно рассмотрим каждый из типов полей.

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 используется для добавления элементов ввода внутри формы. название относится к собственности студента титул. 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', 
)); 

Здесь Widget — это основной способ визуализации поля.

Он выполняет следующую функцию.

  • Выбор — представляет три выбранных входа. Порядок выбора определяется в опции формата.

  • text — отображает три поля ввода типа text (месяц, день, год).

  • single_textвизуализирует один тип ввода даты. Ввод пользователя проверяется на основе параметра формата.

Выбор — представляет три выбранных входа. Порядок выбора определяется в опции формата.

text — отображает три поля ввода типа 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', 
));

Обратите внимание, что переключатели не могут быть отключены, значение изменяется только тогда, когда установлен другой переключатель с тем же именем.

RepeatedType

Это специальное поле «группа», которое создает два одинаковых поля, значения которых должны совпадать. Его синтаксис выглядит следующим образом —

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 с расширенным набором текста.

флажок

Возвращает 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'); 

этикетка

Возвращает тег метки с указанным параметром.

переключатель

Возвращает 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. Для этого мы должны придерживаться следующих шагов —

Шаг 1. Создайте приложение Symfony

Создайте приложение Symfony, formample , используя следующую команду.

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», и он выдаст следующий результат.