Symfony2 - default-Werte im Formular-Sammlung Prototyp
Ich versuche, die Sammlung Prototyp, eine Reihe von default-Werten anstelle von leeren Werten. Im Idealfall würde ich mag in der Lage sein zu definieren, die diesen Standard irgendwo, entweder in der model-Klasse oder der form-definition-Klasse, aber ich kann nicht einen Weg finden, dies zu tun, überall.
Als Beispiel:
Habe ich eine AbstractType für meine form, die enthält eine geschachtelte Kollektion von Person Zeilen relevanten code siehe unten):
public function buildForm(FormBuilder $builder, array $options)
{
...
$builder->add('people', 'collection', array(
'type' => new PersonType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
));
...
}
Den PersonType-Klasse enthält den folgenden code:
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('name', 'text');
$builder->add('date_of_birth', 'date');
$builder->add('age', 'number');
//This would be great if I could do this but I can't:
//$builder->add('date_of_birth', 'date', array('empty_value' => new \DateTime(...))); //some default value defined here
}
Die besten, die ich habe in der Lage zu kommen mit so weit unten in der Datei anzeigen (der code wird verwendet, um das Rendern der Sammlung Prototyp):
...
<tr>
<td> {{ form_widget(person.name) }} </td>
{# THIS DOES NOT WORK (I just get the default selected date) #}
<td> {{ form_widget(person.date_of_birth, {'value': person.date_of_birth.get('value')|default({'year':2010, 'month':10, 'day':15})} }} </td>
{# THIS WORKS (the field contains '0' instead of being empty) #}
<td> {{ form_widget(person.age, {'value': person.age.get('value')|default(0)} }} </td>
</tr>
...
- Es scheint nur zu funktionieren mit einfachen Typen wie text und Zahl. Es funktioniert nicht mit dem Datum geben.
- Sowieso nicht das Gefühl, der richtige Ansatz. Ich sollte in der Lage sein, zu definieren, eine Standard-oder leeren Wert entweder in das zugrunde liegende Modell (z.B.
protected $age = 10;
innerhalb der Modell-Klasse), oder sonst in der form-definition (AbstractType) Klasse (z.B. array('empty_value' => new DateTime()), aber weder sind derzeit möglich.
So in der Zusammenfassung, meine Frage ist:
Wie kann ich festlegen, die Standardwerte für eine model-Klasse, die wird automatisch eingestellt, auf dem client beim hinzufügen von neuen Elementen zu einem Formular 'Sammlung' (statt einfach nur Leerzeichen).
Kennt jemand eine gute Möglichkeit, dies zu tun?
$builder->add('items', CollectionType::class, array( 'entry_type' => ItemType::class, 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, 'prototype_data' => new ItemData(), ))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Konstruktor der Entität, die die form benutzt wird, setzen Sie einfach das Datum ein \DateTime-Objekt, etwa so:
Können Sie auch verwenden \DateTime('now') oder \DateTime('morgen'), wie beschrieben in der Diskussion unter
http://groups.google.com/group/symfony2/browse_thread/thread/18a5b20aca485dc4/e9947d0f06d6519d
Bearbeiten: Tatsächlich, diese Informationen in der symfony2-Dokumentation:
http://symfony.com/doc/2.0/book/forms.html#building-the-form
kann
$builder->setData(...)
übernimmt ein einzelnes argument, mit einer Instanz der Klasse zugeordnet, die form geben (z.B. definiert indata_class
imgetDefaultOptions
). Diese Instanz dient dann als Vorgabe für die form. Ich habe mein problem gelöst, indem nur die Initialisierung meine entity-Klasse mit default-Werten.Mit Symfony - >2.0 ist das nicht möglich.
Symfony 2.0 abgerufen werden die Werte für den Prototyp aus dem zugrunde liegenden Objekt, so dass Sie Sie in den Konstruktor verändert sich auch die Werte in den Prototyp. Doch dieses Verhalten wurde geändert, die mit Symfony 2.1 die entfernt diese Funktionalität, depraving uns die Möglichkeit, default-Werte für den Prototyp:
Es ist ein Fehler in der aktiven Entwicklung sollte Unterstützung für ein
data_prototype
option. Mit dieser option wird es möglich sein, Daten bereitstellen, vorfüll der Prototyp. Allerdings, das wird wahrscheinlich freigegeben werden, nicht früher als mit Symfony 2.7.