2016-12-07 4 views
0

Ich möchte ein verstecktes Feld in meiner symfony Form ohne Präfix. Dieses Feld speichert einige Informationen, die ich brauchte, um den Formulartyp in meinem Listener neu zu erstellen. Ich möchte nicht über alle $request Parameter iterieren, um das richtige Formular zu erhalten, also möchte ich einfaches Feld ohne Präfix hinzufügen. Dies muss im Form Builder behandelt werden, da das Frontend nicht Teil des Bundles ist.Symfony Formular Feld ohne Präfix hinzufügen

Aktuelle vereinfachte Code:

$builder->add('firstName'; TextType::class); 
$builder->add('lastName'; TextType::class); 
// ... 
// field without prefix 
$builder->add('someValue', HiddenType::class, ['mapped' => false]); 

Erwartetes Ergebnis:

<input type="text" name="form_name[firstName]" /> 
<input type="text" name="form_name[lastName]" /> 
<!-- ... --> 
<input type="hidden" name="someValue" /> <!-- without prefix --> 

Die Sache ist, ich es mit $request->request->get('someValue') zugreifen müssen. Da mein Formularname dynamisch ist, kann ich nicht auf das Array zugreifen.

Ist das möglich?

+0

Während die meisten Dinge möglich sind, wird dieser Sie Ihr Haar ausreißen lassen. Das Präfix wird verwendet, um gebuchte Daten mit handleRequest abzubilden. Sie können es wirklich nicht einfach weglassen und erwarten, dass die Formularkomponente funktioniert.Ich bin Ihrem Anwendungsfall nicht ganz gefolgt, aber wenn es sich um einen schreibgeschützten Wert handelt, der nicht von der Formularkomponente verarbeitet werden muss, geben Sie den HTML-Code möglicherweise direkt in Ihrer Zweigvorlage aus. – Cerad

+0

@Cerad wie gesagt das Frontend ist nicht Teil des Bundles und ich möchte nicht, dass jeder Formular-Theme-Ersteller diese Werte jedes Mal hinzufügen muss, wenn sie ein Formular erstellen. –

Antwort

0

Ja, Sie können. Schauen here

Beispiel:

use Symfony\Component\OptionsResolver\OptionsResolver; 

class TaskType extends AbstractType 
{ 
    // buildForm() method: add your fields here 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => 'AppBundle\Entity\Task', 
      'csrf_protection' => true, 
      'csrf_field_name' => 'formKey', 
      // a unique key to help generate the secret token 
      'csrf_token_id' => 'task_item', 
     )); 
    } 

    // ... 
} 

LE:

grub ich ein wenig mehr über dieses Problem zu informieren. Und ich konnte keinen geeigneten Weg finden, nur das Attribut name für ein bestimmtes Formularfeld zu überschreiben. So habe ich am Ende oben mit:

1. Fügen Sie ein neues Attribut name für das Feld, aber Sie werden mit zwei name Attributen am Ende, und ich habe nicht testen, um zu sehen, welche verwendet werden soll. Ich denke, der Erste.

{{ form_row(form.someValue, { attr:{ name:'someValue' } } }} 

//This will look like: 
<input type="hidden" id="category_someValue" name="category[someValue]" name="someValue" /> 

Und wenn Sie auf der Quellseite anschauen, werden Sie das letzte name Attribut in der roten Farbe sehen. Nicht so gut, denke ich.

2. Verwendung in Ihrer Type-Klasse, die getBlockPrefix() Methode, die die ganze Form Präfix außer Kraft gesetzt werden:

// AppBundle/Form/FormType.php 
public function getBlockPrefix() 
{ 
    return ''; // return an empty string here 
} 

Und jetzt entfernen Sie die attr für Ihre Feld hinzugefügt, und gerade auf diese:

Aber jetzt alle Formularfelder, wird nicht mehr form_name[first_name] wie Name Attribut, sondern nur name="first_name". So wird Ihr verstecktes Feld haben: name="someValue".

Aber bitte lassen Sie uns wissen, wenn Sie eine bessere Lösung finden (im Idealfall die richtige).

+0

Ich möchte nicht ein csrf Token integrieren Ich möchte nur ein verstecktes Feld ohne ein "Präfix". Um mit '$ request-> request-> get ('someValue')' darauf zuzugreifen. wird das Feld umbenennen, um es klarer zu machen. –

0

Ich weiß nicht, ob das möglich ist (ich denke es ist nicht). Könnte Ihr Problem mit der getName() Methode Ihrer FormType behoben werden? Beispiel:

// Controller 
$form = $this->createForm(YourType::class, $yourObject); 
// Get all parameters related to the form 
$data = $request->request->get($form->getName()); 
// Output 'someValue' 
echo $data['someValue']; 
+0

Das Formular wird dynamisch erstellt und benötigt '$ request-> request-> get ('someValue') ;, um erstellt zu werden. Der Name ist in der Form unbekannt, weil er auch dynamisch ist. –

Verwandte Themen