2013-01-13 192 views
4

我想製作自定義日期時間表單字段。 像這樣answer我使用DataTransformer將日期時間字段與一個日期表單字段和時間表單字段分開。symfony2自定義時間選擇字段

我使用的日期選擇一個jQuery日期選擇器,但我想有時間選擇ONE自定義選擇表單字段蒙山半小時intervalls:

00:00 
00:30 
... 
23:30 

這裏是我的代碼,但我不知道如何接近這個

在我的實體

/** 
* Time 
* 
* @ORM\Table(name="time") 
* @ORM\Entity 
*/ 
class Time 
{ 

... 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="begin_date", type="datetime", nullable=false) 
    */ 
    private $beginDate; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="end_date", type="datetime", nullable=false) 
    */ 
    private $endDate; 

... 

    /** 
    * Set beginDate 
    * 
    * @param \DateTime $beginDate 
    * @return Time 
    */ 
    public function setBeginDate($beginDate) 
    { 
     $this->beginDate = $beginDate; 

     return $this; 
    } 

    /** 
    * Get beginDate 
    * 
    * @return \DateTime 
    */ 

     public function getBeginDate() 
    { 
     $this->beginDate; 
    } 

    /** 
    * Set endDate 
    * 
    * @param \DateTime $endDate 
    * @return Time 
    */ 
    public function setEndDate($endDate) 
    { 
     $this->endDate = $endDate; 

     return $this; 
    } 

    /** 
    * Get endDate 
    * 
    * @return \DateTime 
    */ 
    public function getEndDate() 
    { 
     return $this->endDate; 
    } 

... 

} 

表單類型

class TimeType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
     ->add('beginDate', 'my_datetime', array('label' => 'label.form.date')) 
     ->add('endDate', 'my_datetime', array('label' => 'label.form.date')); 
    } 

    public function getName() 
    { 
     return 'Time'; 
    } 
}  

因此,這裏是我的自定義表單類型:

class MyDateTimeType extends AbstractType 
{ 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
    ->add('date', 'genemu_jquerydate', array('input' => 'datetime','widget' => 'single_text','format' => 'dd/MM/yyyy','error_bubbling' => true)) 
    ->add('time', 'choice', array(
     'choices' => array(
      '00:00' => '00:00', 
      '00:30' => '00:30', 
      '01:00' => '01:00', 
... 
      '22:30' => '22:30', 
      '23:00' => '23:00', 
      '23:30' => '23:30', 
      ),'error_bubbling' => true 
)); 

    $builder->appendClientTransformer(new DateTimeToDateTimeArrayTransformer()); 
} 

public function getDefaultOptions(array $options) 
{ 
    return array(
     'label' => 'label.form.date', 
     'error_bubbling' => false 
     ); 
} 

public function getName() 
{ 
    return 'my_datetime'; 
} 
} 

這是DataTransformer:

class DateTimeToDateTimeArrayTransformer implements DataTransformerInterface 
{ 
public function transform($datetime) 
{ 
    if(null !== $datetime) 
    { 
     $date = clone $datetime; 
     $date->setTime(12, 0, 0); 

     $time = clone $datetime; 
     $time->setDate(1970, 1, 1); 
    } 
    else 
    { 
     $date = null; 
     $time = null; 
    } 

    $result = array(
     'date' => $date, 
     'time' => $time 
    ); 

    return $result; 
} 

public function reverseTransform($array) 
{ 
    $date = $array['date']; 
    // $time = $array['time']; // Fatal error: Call to a member function format() on a non-object 
    $time = new \DateTime($array['time']); 

    if(null == $date || null == $time) 
     return null; 

    $date->setTime($time->format('G'), $time->format('i')); 

    return $date; 
} 
} 

表顯示是正確的,但是當我提交表單我得到這個錯誤:

Notice: Object of class DateTime could not be converted to int in /var/www/ttime/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php line 457 500 Internal Server Error - ErrorException

雖然我已將分割項目datetime +自定義選項正確地持久保存到數據庫。

我認爲reverseTransform函數的返回日期時間格式,以及表單生成器無法將其轉換爲選擇格式:

array('00:00' => '00:00',...)

你能告訴我怎樣才能擺脫這種錯誤的?

有沒有更好的方法來做到這一點?

+0

可能是你的實體或你存儲日期的數據庫被定義爲一個INT。你爲什麼不把它們複製到你的問題中? – Xocoatzin

+0

我已經更新了問題,實體的對象是日期時間對象 – Alex

回答

2

由datatransformers轉換函數返回的數據數組是由DateTime對象組成的數組。這些對象不能轉換爲選擇字段值。爲了解決這個問題返回實際格式化的日期和時間字符串:

$result = array(
    'date' => $date->format('Y-m-d'), 
    'time' => $time->format('H:i') 
); 

另外,reverseTransform功能應該然後將這些字符串轉換回一個實際的DateTime對象,使用下面的代碼:

$dateTimeString = $array['date'] . ' ' . $array['time']; 
return DateTime::createFromFormat('Y-m-d H:i', $dateTimeString); 
+0

感謝您的回答,但它仍然不起作用: 如果我在轉換函數 '$ result = array( 'date'=> $ date - >格式( 'YM-d'), '時間'=> $時間>格式( 'H:I') );' 此錯誤出現:致命錯誤:調用一個成員函數格式()上非對象 – Alex

+0

如果我使用此在變換: '$結果=陣列( '日期'=> $日期, '時間'=> $時間 );' 而這在reverseTRansform: '$ dateTimeString = $ array ['date']。 ''。 $陣列[ '時間']; 返回日期時間:: createFromFormat( 'Y-M-d H:I',$ dateTimeString);' 此錯誤出現:捕致命錯誤:類日期時間的對象不能被轉換成字符串 – Alex