2017-02-21 149 views
0

我有像這樣一些非必需的,可爲空的元素有規律formType:Symfony的實體堅持空

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

在實體一個新的記錄,它的工作原理 - 這是一個NULL。但是,如果我確實定義了它,並且稍後嘗試通過更新表單將其刪除,則它不會更新並保留其值。

isValid()塊我檢查:

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

而且它實際上是空的。同一個實體:

$entity->getMyTime() 

爲空。但是當我

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

mytime仍然有其舊值。

我錯過了什麼?

[編輯]的要求,全面控制器代碼:

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

[EDIT2] 一些測試與我的答案得到了想法後,我在isValid()節嘗試這樣做:

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

因此,它將時間設置爲00,並且我可以使用它...但: - 重新加載時的頁面仍顯示舊值。我認爲這很正常,因爲$editForm是在isValid()之前聲明的(明顯)並且沒有更新。由於在數據庫中存儲00:00與NULL相關性較低,因此它遠不是理想的。

+0

你可以在創建實體並設置時間的地方顯示完整的代碼,直到你堅持並刷新它爲止? –

+0

用控制器代碼編輯@AlvinBunk,是你想要的嗎? –

+0

你的實體中有setter方法,叫做setMytime(),M是大寫的嗎?似乎表單字段沒有映射到實體。另請參閱開發環境中窗體部分的Symfony分析器。 – ste

回答

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

我想上面的代碼可能工作。嘗試一下。希望它有效。

謝謝&此致敬禮。

+1

if(is_null($ entity-> getmytime())|| empty($ entity-> getmytime())){ var_dump($ entity); exit; $ entity-> setMytime(null); } 您可以檢查併發布以上幾行的輸出嗎? –

+1

我只想看看mytime包含的內容以及是否正在執行block。 –

+0

它確實有效,我不得不調整小事情,但最終它是好的!塊跑了,只是表單沒有在視圖中更新,JS是錯誤的...... Cound你解釋爲什麼檢測到該實體是'null',然後將其設置爲...'null'的作品?! –

1

你可以嘗試(第二編輯)這樣的:

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

我認爲這是正確的代碼。目前在您的發佈代碼中,您不會對錶單或實體執行任何操作,因此沒有任何更改。您需要對錶單或實體執行某些操作,然後保留並刷新它以查看數據庫中的任何內容。

上面的代碼可能不起作用,但試試看,希望你能明白。

+0

錯誤500 - 您無法更改提交表單的數據! –

+0

您正在設置表單字段中的數據,而不是在實體 – zenith

+0

@mdma中,代碼是正確的。我犯了一個錯誤,因爲它需要在提交調用之前設置。在[在Symfony的文檔中創建表單類](https://symfony.com/doc/current/forms.html#creating-form-classes)中設置相同的示例。絕對不值得-1因爲代碼應該工作。 –