2014-04-09 31 views
2

你好我收集數據爲JSON格式,並在我的服務器網站上我必須通過Doctrine存儲它們。一切正常,但我有驗證錯誤,當我recive日期時間格式數據。我在控制器上測試分離的動作這種情況下:從json數據的symfony persist datetime

public function indexAction($name) 
{ 

    $em = $this->getDoctrine()->getManager(); 

    $test = new Test(); 
    $test->setName("Test"); 
    //$test->setStart(new \DateTime()); 
    $form = $this->createForm(new TestType(), $test); 

    $store = array(
     "name" => "Test", 
     "start" => new \DateTime()//will be something like *2014-04-09 11:11:11' 
    ); 

    $form->submit($store); 

    if ($form->isValid()) { 
     $em->persist($test); 
     $em->flush(); 
    } else var_dump($this->getErrorMessages($form)); 


    return $this->render('CodeTestBundle:Default:index.html.twig', array('name' => $name)); 
} 

VAR轉儲是:

陣列(大小= 1) '開始'=> 陣列(大小= 3) 0 =>串'這個值是無效的。' (長度= 24)

'date' => 
    array (size=3) 
     'year' => 
     array (size=0) 
      ... 
     'month' => 
     array (size=0) 
      ... 
     'day' => 
     array (size=0) 
      ... 
    'time' => 
    array (size=2) 
     'hour' => 
     array (size=0) 
      ... 
     'minute' => 
     array (size=0) 
      ... 

回答

1

哼,你應該使用替代的handleRequest:

public function indexAction($name, Request $request) // Add the Request 
{ 

    $em = $this->getDoctrine()->getManager(); 

    $test = new Test(); 
    $test->setName("Test"); 
    //$test->setStart(new \DateTime()); 
    $form = $this->createForm(new TestType(), $test); 

    $store = array(
     "name" => "Test", 
     "start" => new \DateTime()//will be something like *2014-04-09 11:11:11' 
    ); 

    // $form->submit($store); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em->persist($test); 
     $em->flush(); 
    } else var_dump($this->getErrorMessages($form)); 


    return $this->render('CodeTestBundle:Default:index.html.twig', array('name' => $name)); 
} 
1

你必須使用一個變壓器:

namespace MyProject\SMyBundle\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class StringToDateTimeTransformer implements DataTransformerInterface 
{ 

public function reverseTransform($string) 
{ 

    if (!$string) { 
     return new \DateTime("now"); 
    } 
    $date = new \DateTime((string)$string['date']); 
    return $date; 
} 

public function transform($date) 
{ 
    if (!$date) { 
     return null; 
    } 

    $string = date_parse ( date_format($date, "Y-m-d H:i:s")); 
    if (!$string) { 
     throw new TransformationFailedException(sprintf(
      'Cant transform date to string!', 
      $date 
     )); 
    } 
    return $string; 
} 
} 

並添加場這樣的:

$sToDTTranformer = new DatetimeToStringTransformer(); 
    $builder->add('datetime', 'text') 
     ->addViewTransformer($sToDTTranformer); 

更多信息:http://symfony.com/en/doc/current/cookbook/form/data_transformers.html

4

你的問題是,表單框架期望視圖數據到由一個微件對於每個日期和時間分量的處理,因爲日期時間字段類型的默認插件設置爲選擇。

如果您將datetime字段配置爲單個文本輸入,則驗證程序將接收一個字符串而不是數組結構,並根據您的預期處理它,而無需執行任何其他轉換。在你的情況下,現場配置看起來像:

$builder->add('start', 'datetime', array(
    'widget' => 'single_text', 
    'input' => 'datetime' 
));