Symfony - Formularios

Symfony proporciona varias etiquetas integradas para manejar formularios HTML de forma fácil y segura. El componente Form de Symfony realiza el proceso de creación y validación de formularios. Conecta el modelo y la capa de vista. Proporciona un conjunto de elementos de formulario para crear un formulario html completo a partir de modelos predefinidos. Este capítulo explica los formularios en detalle.

Campos de formulario

La API del marco de trabajo Symfony admite un gran grupo de tipos de campos. Repasemos cada uno de los tipos de campo en detalle.

FormType

Se utiliza para generar un formulario en el marco Symfony. Su sintaxis es la siguiente:

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);

Aquí, $studentinfo es una entidad de tipo Student. createFormBuilderse utiliza para crear un formulario HTML. El método add se usa paraadd elementos de entrada dentro del formulario. title se refiere a la propiedad del título del estudiante. TextType::classse refiere al campo de texto html. Symfony proporciona clases para todos los elementos html.

Tipo de texto

El campo TextType representa el campo de entrada de texto más básico. Su sintaxis es la siguiente:

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

Aquí, el nombre se asigna a una entidad.

TextareaType

Muestra un elemento HTML de área de texto. Su sintaxis es la siguiente:

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

EmailType

El campo EmailType es un campo de texto que se representa con la etiqueta de correo electrónico HTML5. Su sintaxis es la siguiente:

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

PasswordType

El campo PasswordType muestra un cuadro de texto de entrada de contraseña. Su sintaxis es la siguiente:

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

RangeType

El campo RangeType es un control deslizante que se representa con la etiqueta de rango HTML5. Su sintaxis es la siguiente:

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

PercentType

PercentType representa un campo de texto de entrada y se especializa en el manejo de datos porcentuales. Su sintaxis es la siguiente:

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

DateType

Genera un formato de fecha. Su sintaxis es la siguiente:

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

Aquí, Widget es la forma básica de renderizar un campo.

Realiza la siguiente función.

  • choice- Representa tres entradas seleccionadas. El orden de las selecciones se define en la opción de formato.

  • text - Representa una entrada de tres campos de tipo texto (mes, día, año).

  • single_text- Representa una sola entrada de tipo fecha. La entrada del usuario se valida en función de la opción de formato.

Tipo de casilla de verificación

Crea una casilla de verificación de entrada única. Esto siempre debe usarse para un campo que tenga un valor booleano. Su sintaxis es la siguiente:

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

Tipo de radio

Crea un solo botón de radio. Si se selecciona el botón de opción, el campo se establecerá en el valor especificado. Su sintaxis es la siguiente:

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

Tenga en cuenta que, los botones de opción no se pueden desmarcar, el valor solo cambia cuando se marca otro botón de opción con el mismo nombre.

RepeatedType

Este es un campo especial "grupo", que crea dos campos idénticos cuyos valores deben coincidir. Su sintaxis es la siguiente:

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'), 
));

Esto se usa principalmente para verificar la contraseña o el correo electrónico del usuario.

ButtonType

Un simple botón en el que se puede hacer clic. Su sintaxis es la siguiente:

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

ResetType

Un botón que restablece todos los campos a sus valores iniciales. Su sintaxis es la siguiente:

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

ChoiceType

Un campo de usos múltiples se utiliza para permitir al usuario "elegir" una o más opciones. Se puede representar como una etiqueta de selección, botones de opción o casillas de verificación. Su sintaxis es la siguiente:

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

SubmitType

Se utiliza un botón de envío para enviar datos de formulario. Su sintaxis es la siguiente:

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

Función de asistente de formulario

Las funciones auxiliares de formulario son funciones twig que se utilizan para crear formularios fácilmente en plantillas.

form_start

Devuelve una etiqueta de formulario HTML que apunta a una acción, ruta o URL válida. Su sintaxis es la siguiente:

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

form_end

Cierra la etiqueta de formulario HTML creada con form_start. Su sintaxis es la siguiente:

{{ form_end(form) }}

textarea

Devuelve una etiqueta de área de texto, opcionalmente envuelta con un editor de JavaScript de texto enriquecido en línea.

caja

Devuelve una etiqueta de entrada compatible con XHTML con type = "checkbox". Su sintaxis es la siguiente:

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

input_password_tag

Devuelve una etiqueta de entrada compatible con XHTML con type = "contraseña". Su sintaxis es la siguiente:

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

input_tag

Devuelve una etiqueta de entrada compatible con XHTML con type = "text". Su sintaxis es la siguiente:

echo input_tag('name');

etiqueta

Devuelve una etiqueta de etiqueta con el parámetro especificado.

boton de radio

Devuelve una etiqueta de entrada compatible con XHTML con type = "radio". Su sintaxis es la siguiente:

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

reset_tag

Devuelve una etiqueta de entrada compatible con XHTML con type = "reset". Su sintaxis es la siguiente:

echo reset_tag('Start Over');

Seleccione

Devuelve una etiqueta selecta poblada con todos los países del mundo. Su sintaxis es la siguiente:

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

enviar

Devuelve una etiqueta de entrada compatible con XHTML con type = "submit". Su sintaxis es la siguiente:

echo submit_tag('Update Record');

En la siguiente sección, aprenderemos cómo crear un formulario usando campos de formulario.

Solicitud de formulario de estudiante

Creemos un formulario simple de detalles del estudiante usando los campos del formulario de Symfony. Para hacer esto, debemos seguir los siguientes pasos:

Paso 1: crea una aplicación Symfony

Crea una aplicación Symfony, formsample, usando el siguiente comando.

symfony new formsample

Las entidades se crean normalmente en el directorio "src / AppBundle / Entity /".

Paso 2: crear una entidad

Cree el archivo "StudentForm.php" en el directorio "src / AppBundle / Entity /". Agregue los siguientes cambios en el archivo.

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; 
   } 
}

Paso 3: agregar un StudentController

Vaya al directorio “src / AppBundle / Controller”, cree el archivo “StudentController.php” y agregue el siguiente código en él.

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(), 
         )); 
   } 
}

Paso 4: renderizar la vista

Vaya al directorio "app / Resources / views / student /", cree el archivo "new.html.twig" y agregue los siguientes cambios en él.

{% 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 %}

Ahora solicite la URL, “http: // localhost: 8000 / student / new” y producirá el siguiente resultado.

Resultado