symfony-forms
#symfony-
Inhaltsverzeichnis
Über 1
Kapitel 1: Erste Schritte mit Symfony-Formularen 2
Bemerkungen 2
Examples 2
Installation oder Setup 2
Kapitel 2: Beispiel für Symfony-Formularereignisse 3
Bemerkungen 3
Examples 3
onPostSubmit-Ereignis 3
FormEvents :: PRE_SUBMIT 4
FormEvents :: PRE_SET_DATA 5
Kapitel 3: Formen 8
Syntax 8
Bemerkungen 8
Examples 8
Erstellen Sie ein einfaches Formular in einem Controller 8
Erstellen Sie einen benutzerdefinierten Formulartyp 9
Prüfen Sie, ob alle Felder in der Vorlage dargestellt werden 10
Umgang mit Formularoptionen 10
Mit Formularereignissen umgehen 11
Credits 13
Über
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: symfony-forms
It is an unofficial and free symfony-forms ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official symfony-forms.
The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@zzzprojects.com
Kapitel 1: Erste Schritte mit Symfony- Formularen
Bemerkungen
Dieser Abschnitt bietet einen Überblick darüber, was Symfony-Formulare sind und warum ein Entwickler es verwenden möchte.
Es sollte auch große Themen in Symfony-Formen erwähnen und auf die verwandten Themen verweisen. Da die Dokumentation für Symfony-Formulare neu ist, müssen Sie möglicherweise erste Versionen dieser verwandten Themen erstellen.
Examples
Installation oder Setup
Detaillierte Anweisungen zum Einrichten oder Installieren von Symfony-Formularen.
Erste Schritte mit Symfony-Formularen online lesen: https://riptutorial.com/de/symfony-
forms/topic/10894/erste-schritte-mit-symfony-formularen
Kapitel 2: Beispiel für Symfony- Formularereignisse
Bemerkungen
In obigem Beispiel für weitere Symfony-Formularereignisse.
Examples
onPostSubmit-Ereignis
Dies ist eine Schulung in Symfony, die Informationen zur Benutzerschulung enthält. Wir wollten die Validierung in zwei Bereichen, dem Enddatum der Ausbildung, anwenden und studieren derzeit.
On Post Submit Event, We will check two things
1 - if the user checks the checkbox of is_currently studying then end date should be empty 2 - On the other side, we have to make sure, if end date is not empty, then is currently studying check box should be unchecked.
/**
* Class QualificationFormType * @package UsersBundle\Form\Type */
class QualificationFormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('title') ->add('institution') ->add('startDate', 'date', [ 'label' => 'Start Date', 'widget' => 'single_text', 'format' => 'dd-MM-yyyy', 'required' => true, 'constraints' => [
new Assert\NotBlank(),
new Assert\LessThan("today"), ],
'trim' => true, 'attr' => [
'maxlength' => '12', 'minlength' => '10',
'placeholder' => 'when did you start this education?',
'class' => 'form-control input-inline datepicker datePicker', 'data-provide' => 'datepicker',
'data-date-format' => 'dd-mm-yyyy', 'minViewMode' => '1'
],
'label_attr' => [
'class' => 'control-label', ],
])
->add('endDate', 'date', [ 'label' => 'End Date', 'widget' => 'single_text', 'format' => 'dd-MM-yyyy', 'required' => false, 'attr' => [
'placeholder' => 'when did you end this education?',
'class' => 'form-control input-inline datepicker datePicker', 'data-provide' => 'datepicker',
'data-date-format' => 'dd-mm-yyyy', 'minViewMode' => '1'
],
'label_attr' => [
'class' => 'control-label', ],
])
->add('current', null, [
'label' => ucfirst('I am currently studying'), 'label_attr' => [
'class' => 'control-label', ],
])
->add('save', 'submit') ;
$builder->addEventListener(FormEvents::POST_SUBMIT, [$this, 'onPostSubmit']);
}
function onPostSubmit(FormEvent $event) { $form = $event->getForm();
$endDate = $form->get('endDate')->getData();
$current = $form->get('current')->getData();
If(!$current){
if ($startDate>$endDate ) {
$form['startDate']->addError(new FormError("Start Date cannot be greater than end date..."));
} } } }
FormEvents :: PRE_SUBMIT
In diesem Beispiel wird das Formular in Abhängigkeit von den Entscheidungen geändert, die der
Benutzer zuvor mit dem Formular getroffen hat.
In meinem speziellen Fall musste ich ein Auswahlfeld deaktivieren, wenn ein bestimmtes Kontrollkästchen nicht gesetzt war.
Wir haben also den FormBuilder, in dem wir den
EventListenerfür das
FormEvents::PRE_SUBMIT. Wir verwenden dieses Ereignis, da das Formular bereits mit den übermittelten Daten des Formulars festgelegt ist, das Formular jedoch noch bearbeitet werden kann.
class ExampleFormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$data = $builder->getData();
$builder
->add('choiceField', ChoiceType::class, array(
'choices' => array(
'A' => '1', 'B' => '2' ),
'choices_as_values' => true, ))
->add('hiddenField', HiddenType::class, array(
'required' => false, 'label' => ''
))
->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
// get the form from the event $form = $event->getForm();
// get the form element and its options
$config = $form->get('choiceField')->getConfig();
$options = $config->getOptions();
// get the form data, that got submitted by the user with this request / event $data = $event->getData();
// overwrite the choice field with the options, you want to set
// in this case, we'll disable the field, if the hidden field isn't set $form->add(
'choiceField',
$config->getType()->getName(), array_replace(
$options, array(
'disabled' => ($data['hiddenField'] == 0 ? true : false) )
) );
}) ; } }
FormEvents :: PRE_SET_DATA
Voraussetzung ist, dass in einem Formular geprüft wird, ob das Feld 'Online_date' leer oder gefüllt
ist. Wenn es leer ist, füllen Sie es beim Laden des Formulars mit dem aktuellen Datum.
Controller ruft '$ form-> createForm ()' mit dem Typ "Ordner" auf. In "FolderType" wird der Ereignisabonnent "FolderSubscriber" hinzugefügt.
Controller :
$form = $this->createForm('folder', $folder, array(
'action' => $this->generateUrl('folders_edit', array('id' => $folder-
>getId())),
'method' => 'post' ));
FolderType :
class FolderType extends AbstractType {
public function __construct( FolderSubscriber $folderSubscriber) {
$this->folderSubscriber = $folderSubscriber;
}
public function buildForm(FormBuilderInterface $builder, array $options = array()) {
$builder ->add("onlineDate", "datetime", array( 'widget' => 'single_text'));
$builder->addEventSubscriber($this->folderSubscriber);
}
public function getName() {
return 'folder';
} }
FolderSubscriber : Wird aus FolderType aufgerufen. wo es als Event Subscriber registriert ist
class FolderSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return array(
FormEvents::PRE_SET_DATA => 'onPreSetData', );
}
public function onPreSetData(FormEvent $event) {
$this->setDefaultOnlineDate($event);
}
protected function setDefaultOnlineDate(FormEvent $event) {
$content = $event->getData();
if (!$content->getOnlineDate() instanceof \DateTime){
$content->setOnlineDate(new \DateTime());
} } }
Beispiel für Symfony-Formularereignisse online lesen: https://riptutorial.com/de/symfony-
forms/topic/5039/beispiel-fur-symfony-formularereignisse
Kapitel 3: Formen
Syntax
Formular createForm (Zeichenfolge | FormTypeInterface $ type, gemischte $ data = null, Array $ options = array ())
•
FormBuilder createFormBuilder (gemischter $ data = null, Array $ options = array ())
•
Bemerkungen
Sie können das Ereignis des Prozesses der Formularkomponente mit einem mit der Event Dispatcher- Komponente kompatiblen Formularereignis "anpassen".
Symfony Docs :
Die Formularkomponente stellt einen strukturierten Prozess bereit, mit dem Sie Ihre Formulare mithilfe der EventDispatcher-Komponente anpassen können. Mithilfe von Formularereignissen können Sie Informationen oder Felder in verschiedenen Schritten des Arbeitsablaufs ändern: von der Population des Formulars bis zur Übermittlung der Daten aus der Anforderung.
Examples
Erstellen Sie ein einfaches Formular in einem Controller
Ein Formular gibt dem Benutzer die Möglichkeit, Daten in Ihrer Anwendung strukturiert zu ändern.
Um ein einfaches mutieren
arrayvon Daten, erstellen wir ein Formular ein Formular Builder verwenden:
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
// ...
function myAction (Request $request) { $data = array(
'value' => null, 'number' => 10,
'string' => 'No value', );
$form = $this->createFormBuilder($data)
->add('value', TextType::class, array('required' => false)) ->add('number', NumberType::class)
->add('string', TextType::class) ->add('save', SubmitType::class) ->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
// $data is now changed with the user input // Do something with the data
}
return $this->render(..., array(
'form' => $form->createView(), // ...
));
}
Rendern Sie Ihr Formular in Ihrer Vorlage mit der Funktion
form(...)Twig:
{# Render the form #}
{{ form(form) }}
Es wird ohne Styling wie folgt aussehen:
Die Labels, IDs, Namen und Formular-Tags werden automatisch generiert. Standardmäßig wird das Formular mit einer POST-Anforderung an die aktuelle Seite gesendet.
Erstellen Sie einen benutzerdefinierten Formulartyp
Ein benutzerdefinierter Formulartyp ist eine Klasse, die eine wiederverwendbare
Formularkomponente definiert. Benutzerdefinierte Formularkomponenten können verschachtelt werden, um komplizierte Formulare zu erstellen.
Anstatt ein Formular mit einem Formularersteller in der Steuerung zu erstellen, können Sie Ihren eigenen Typ verwenden, um den Code lesbarer, wiederverwendbarer und wartbarer zu machen.
Erstellen Sie eine Klasse, die Ihren Formulartyp darstellt
// src/AppBundle/Form/ExampleType.php namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class ExampleType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) { $builder
->add('value', TextType::class, array('required' => false)) ->add('number', NumberType::class)
->add('string', TextType::class) ->add('save', SubmitType::class) ;
} }
Sie können Ihr Formular jetzt im Controller verwenden:
use AppBundle\Form\ExampleType;
// ...
$form = $this->createForm(ExampleType::class, $data)
Prüfen Sie, ob alle Felder in der Vorlage dargestellt werden
Beim Rendern eines Formulars "von Hand" kann es nützlich sein zu wissen, ob noch Felder zum Rendern vorhanden sind oder nicht. Die Funktion
isRendered()aus der FormView- Klasse gibt
truezurück
truewenn noch Felder für die Vorlage vorhanden sind.
Dieses Snippet druckt
<h3>Extra fields</h3>wenn der Vorlage noch Felder hinzugefügt werden sollen, gefolgt von den Feldern selbst.
{% if not form.isRendered() %}
<h3>Extra fields</h3>
{{ form_rest(form) }}
{% endif %}
Umgang mit Formularoptionen
In diesem Beispiel habe ich ein Formular erstellt, mit dem ein neuer Benutzer registriert wird. In den an das Formular übergebenen Optionen gebe ich die verschiedenen Rollen an, die ein Benutzer haben kann.
Erstellen einer wiederverwendbaren Klasse für mein Formular mit konfigurierter Datenklasse und einer zusätzlichen Option, die das Auswahlfeld ausfüllt, um eine Nutzerrolle auszuwählen:
class UserType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('firstName', TextType::class, array(
'label' => 'First name' ))
->add('lastName', TextType::class, array(
'label' => 'Last name' ))
->add('email', EmailType::class, array(
'label' => 'Email' ))
->add('role', ChoiceType::class, array(
'label' => 'Userrole',
'choices' => $options['rolechoices']
))
->add('plain_password', RepeatedType::class, array(
'type' => PasswordType::class,
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat password') ))
->add('submit', SubmitType::class, array(
'label' => 'Register user' ));
}
public function configureOptions(OptionsResolver $optionsResolver) {
$optionsResolver->setDefaults(array(
'data_class' => 'WebsiteBundle\Entity\User', 'rolechoices' => array()
));
} }
Wie Sie sehen, wurde dem Formular eine Standardoption mit dem Namen 'roleChoises'
hinzugefügt. Diese Option wird erstellt und in der Methode übergeben, um ein Formularobjekt zu erstellen. Siehe nächster Code.
Formularobjekt in meinem Controller erstellen:
$user = new User();
$roles = array(
'Admin' => User::ADMIN_ROLE, 'User' => User::USER_ROLE );
$form = $this->createForm(UserType::class, $user, array(
'rolechoices' => $roles ));
Mit Formularereignissen umgehen
Um mit Formularereignissen umgehen zu können, muss die Anforderung, die nach dem Senden eines Formulars an eine Controller-Aktion gesendet wird, an das in dieser Aktion erstellte
Formular angehängt werden.
public function registerAction(Request $request) {
$data = new ExampleObject();
$form = $this->createForm(ExampleObjectType::class, $data);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
// do something with form data
return $this->redirectToRoute('route_name');
}
return $this->render('view.html.twig', array(
'form' => $form->createView() ));
}
Die an die Aktion übergebene Anforderungsvariable hat den Typ
Symfony\Component\HttpFoundation\Request