2013-01-13 2 views
4

맞춤 datetime 양식 필드를 만들려고합니다. 이 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; 
    } 

... 

} 

양식 유형에서이

접근

그래서 여기 373,

내 사용자 지정 양식 유형 :

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 + custom choice가 DB에 제대로 저장되어 있습니다.

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

당신이 말해 줄 수 방법이 오류를 제거 할 수 있습니다

은 내가 reverseTransform 기능 반환 날짜 형식, 그리고 그것은 선택 형식으로 변환 할 수 없습니다 양식 빌더라고 생각?

더 좋은 방법이 있나요?

+0

아마 당신의 법인 또는 날짜를 저장하는 데이터베이스는 INT로 정의됩니다. 왜 당신의 질문에 그것들을 복사하지 않습니까? – Xocoatzin

+0

질문을 업데이트했습니다. 엔티티의 객체는 datetime 객체입니다 – Alex

답변

2

datatransformers transform 함수에서 반환하는 데이터 배열은 DateTime 객체의 배열입니다. 이러한 객체는 선택 필드 값으로 변환 할 수 없습니다. 이 실제 형식의 날짜와 시간 문자열을 반환 해결하려면 :

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

를 또한 다음 코드를 사용하여, 실제 날짜 시간 오브젝트로 이러한 문자열을 변환해야 reverseTransform 기능 :

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

답변을 주셔서 감사합니다. 그러나 여전히 작동하지 않습니다 : 변환 함수에 이것을 사용하면 '$ result = array ( 'date'=> $ date 이 오류가 나타납니다 : 치명적인 오류 : 멤버 함수 형식()을 호출하여 비 오브젝트 – Alex

+0

난이있는 변환을 사용하는 경우 : '$ 결과 = 배열 ​​( '날짜 '=> $ 날짜 '시간 '=> $ 시간 )' 그리고 reverseTRansform이 : '$ dateTimeString = $ array [ 'date']. ''. $ array [ 'time']; return DateTime :: createFromFormat ('Y-m-d H : i', $ dateTimeString); ' 이 오류가 나타납니다. Catchable Fatal Error : DateTime 클래스의 Object를 string으로 변환 할 수 없습니다. – Alex