2017-02-21 7 views
0

Ich habe einen regulären Formulartyp mit einigen nicht erforderlich, Nullable-Elementen wie so:Symfony Einheit bestehen bleibt null

->add('mytime', TimeType::class, array(
    'input' => 'datetime', 
    'widget' => 'single_text', 
    "required" => false 
)) 

In der Einheit:

/** 
* @var \DateTime 
* 
* @ORM\Column(name="mytime", type="time", nullable=true) 
*/ 
private $mytime = null; 

Wenn ich definiere, es nicht beim Einlegen ein neuer Rekord, es funktioniert - es ist ein NULL. Aber wenn ich es definiere und später versuche es zu entfernen, indem ich das Formular aktualisiere, wird es nicht aktualisiert und behält seinen Wert.

Im isValid() Block I geprüft:

$data = $editForm->all(); 
print_r($data['mytime']->getData()); 

Und es ist tatsächlich leer. Gleich in der Einheit:

$entity->getMyTime() 

ist leer. Aber wenn ich

$em->persist($entity); 
$em->flush(); 

mytime hat immer noch seinen alten Wert.

Was fehlt mir?

[EDIT] wie gewünscht, vollständiger Controller-Code:

public function myFunctionAction(Request $request ,$id, $to) { 
    $em = $this->getDoctrine()->getManager(); 
    $entity = $em->getRepository(Day::class)->find($id); 

    $editForm = $this->createForm(new DayType(), $entity); 
    $editForm->add('submit', 'submit', array('label' => 'Update')); 

    $editForm->handleRequest($request); 
    if ($editForm->isSubmitted() && $editForm->isValid()) { 
     $em->persist($entity); 
     $em->flush(); 
    } 

    return array(
     'entity'  => $entity, 
     'to'   => $to, 
     'edit_form' => $editForm->createView(), 
    ); 
} 

[EDIT 2] Nach einigen Tests mit den Ideen, die ich aus den Antworten bekam, habe ich dies im isValid() Abschnitt versucht:

if(is_null($entity->getMyTime()) || empty($entity->getMyTime())) 
    $entity->SetMyTime((new \DateTime())->setTime(00, 00)); 

Also, es setzt die Zeit auf 00, und ich könnte das möglicherweise verwenden ... ABER: - Die Seite, wenn neu geladen zeigt immer noch den alten Wert. Es ist normal, denke ich, da $editForm vor isValid() deklariert wird (offensichtlich) und nicht aktualisiert. - Es ist weit davon entfernt, ideal zu sein, da das Speichern von 00:00 in der DB viel weniger relevant ist als ein NULL.

+0

Können Sie Ihren vollständigen Code anzeigen, wo Sie die Entität erstellen und die Zeit festlegen, bis Sie fortbestehen und es leeren? –

+0

@AlvinBunk mit Controller-Code bearbeitet, ist das, was Sie wollten? –

+0

Haben Sie die Setter-Methode in Ihrer Entity namens setMytime(), mit M in der Oberschale? Es scheint, dass das Formularfeld nicht der Entität zugeordnet ist. Siehe auch den Symfony-Profiler im Formularabschnitt in der Entwicklungsumgebung. – ste

Antwort

1
if ($editForm->isSubmitted() && $editForm->isValid()) { 
    if(is_null($entity->getmytime()) || empty($entity->getmytime())) { 
     $entity->setMytime(null); 
    } 
    $em->persist($entity); 
    $em->flush(); 
} 

Ich denke, der obige Code könnte funktionieren. Versuch es. Hoffe, es funktioniert.

Danke & Grüße.

+1

if (is_null ($ entity-> getmytime()) || leer ($ entity-> getmytime())) { var_dump ($ entity); exit; $ entity-> setMytime (null); } Können Sie bitte überprüfen und die Ausgabe der oben genannten Zeilen? –

+1

Ich möchte nur sehen, was mytime enthält und ob Block ausgeführt wird oder nicht. –

+0

Es funktioniert, ich musste kleinere Dinge zwicken, aber am Ende ist es gut! Block ran, einfach das Formular wurde nicht in der Ansicht aktualisiert, JS war fehlerhaft ... Sie erklären, warum das Erkennen dieser Entity "null" ist und dann auf "null" gesetzt wird? –

1

können Sie versuchen, (zweite edit) diese:

... 
$editForm->get('mytime')->setData(new \DateTime()); 
... 
if ($editForm->isSubmitted() && $editForm->isValid()) { 
    $em->persist($entity); 
    $em->flush(); 
} 

Ich denke, dass der richtige Code ist. Zurzeit tun Sie in Ihrem geposteten Code nichts mit dem Formular oder der Entität, also hat sich nichts geändert. Sie müssen etwas mit dem Formular oder der Entität tun und dann fortfahren und es leeren, um alles in der Datenbank zu sehen.

Der obige Code funktioniert möglicherweise nicht, aber versuchen Sie es, hoffentlich bekommen Sie die Idee.

+0

Fehler 500 - Sie können die Daten eines übermittelten Formulars nicht ändern! –

+0

Sie setzen die Daten im Formularfeld, nicht in der Entität – zenith

+0

@mdma, der Code ist korrekt. Ich habe einen Fehler gemacht, dass es vor dem Aufruf zum Senden gesetzt werden muss. Legen Sie das gleiche Beispiel im [Erstellen von Formularklassen in der Symfony-Dokumentation] (https://symfony.com/doc/current/forms.html#creating-form-classes) fest. Definitiv verdient keine -1, weil der Code funktionieren sollte. –

Verwandte Themen