• Keine Ergebnisse gefunden

symfony-forms #symfonyforms

N/A
N/A
Protected

Academic year: 2022

Aktie "symfony-forms #symfonyforms"

Copied!
15
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

symfony-forms

#symfony-

(2)

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

(3)

Ü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

(4)

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

(5)

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

(6)

'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.

(7)

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

EventListener

fü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.

(8)

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

} } }

(9)

Beispiel für Symfony-Formularereignisse online lesen: https://riptutorial.com/de/symfony-

forms/topic/5039/beispiel-fur-symfony-formularereignisse

(10)

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

array

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

(11)

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)

(12)

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

true

zurück

true

wenn 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',

(13)

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

}

(14)

Die an die Aktion übergebene Anforderungsvariable hat den Typ

Symfony\Component\HttpFoundation\Request

Formen online lesen: https://riptutorial.com/de/symfony-forms/topic/4440/formen

(15)

Credits

S.

No Kapitel Contributors

1 Erste Schritte mit

Symfony-Formularen Community 2 Beispiel für Symfony-

Formularereignisse Ajay Bisht, jkucharovic, KhorneHoly, Muhammad Taqi

3 Formen Alfro, Hidde, jkucharovic, Mathieu Dormeval, rubenj

Referenzen

ÄHNLICHE DOKUMENTE

Hrsg.: Entsorgungsbetriebe der Stadt Heilbronn, Cäcilienstraße 49, 74072 Heilbronn, Stand 25/05/2018 Bitte senden an:.. Entsorgungsbetriebe der Stadt Heilbronn

Bitte beachten Sie, dass diese Nachricht von Ihrer, oben genannten E- Mail-Adresse kommen muss und dass dies sämtliche Kammermitteilungen betreffen wird. Sie werden dann

Die zuständige Behörde erhebt nach § 71 Absatz 2 der Bremischen Landesbauordnung grundsätzlich nur die personenbezogenen Daten, die für die Erfüllung der gesetzlichen

Projekt zur „Bildung für nachhaltige Entwicklung“ (Förderbereich 2.1.2 der Richtlinie) Projekt zur Umweltbildung für Kinder und Jugendliche (Förderbereich 2.2.1 der

Die Mitteilung der Kontaktdaten ist freiwillig; sie soll dazu dienen, im Falle des späteren Bekanntwerdens einer Infektion die anderen

Hochschule für angewandte Wissenschaften Fachbereich Landwirtschaft,. Ökotrophologie, Landschaftsentwicklung

Ich beantrage eine Bezuschussung aus den im International Office zentralisierten Mitteln in Höhe von __________ , welche der Mittelplanung / dem Mittelverbrauch „Internationale

hat dem International Office seine/ ihre Impfdokumentation vorgelegt und diese wurde durch das International Office gesichtet und evaluiert.. Presented his/ her/ their