2012-10-31 2 views
0

Appointment 개체에 Reminder 개체와 OneToMany 관계가있는 모델이 있습니다. 알림 양식 모음을 약속 양식에 포함시키고 싶습니다. Appointment 개체에는 Appointment.Date 속성이 있습니다. Reminder 개체에는 Reminder.Date 속성도 있습니다.Symfony2 두 번째 값에 의존하는 DataTransfomer?

"IntervalType"이라는 사용자 정의 유형을 만들었습니다.이 유형은 Reminder.Date 입력에 사용할 "번호"드롭 다운과 "단위"드롭 다운으로 구성됩니다. 아이디어는 사용자가 숫자와 단위 ("1 시간", "2 일"등)를 선택한다는 것입니다.

그런 다음 "2 일"을 Appointment.Date보다 2 일 빠른 Reminder.Date의 DateTime 값으로 변환해야합니다. "IntervalToDateTransformer"라는 사용자 지정 DataTransformer를 사용하여이 작업을 수행하는 방법을 파악하려고합니다. Reminder 폼이나 IntervalType 입력에 데이터 트랜스포머를 추가 할 수 있지만, 트랜스 포머가 Reminder의 부모 Appointment.Date를 인식하도록하려면 어떻게해야합니까?

답변

0

처음에는이 문제에 대해 이전에 연구 한 결과로 가능하지 않다고 생각했습니다. 나는 그것을 시도하기로 결정했다. 그리고 나는 그것을 작용하게했다. 기본적으로 두 필드 문제 및 옵션이있는 사용자 지정 양식 형식을 만들었습니다. 그런 다음 변환에 사용할 수있는 데이터 변환 클래스에서이 두 값을 가져 왔습니다. 다음은 파일입니다.

Note that the 'option' field is not used, but I did verify 
it was accessible from the data transformer. 

Also, I could not manage to render the validation messages declared 
on the data transform class when transformation fails. I stopped 
there, but if you manage to do it let me know. 

먼저 FormType

class IssueSelectorType extends AbstractType 
{ 

    /** 
    * @var ObjectManager 
    */ 
    private $om; 

    /** 
    * @param ObjectManager $om 
    */ 
    public function __construct(ObjectManager $om) 
    { 
     $this->om = $om; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('number', 'text', array(
       // 'mapped' => false 
     )); 
     $builder->add('option', 'choice', array(
       // 'mapped' => false 
     )); 

      $transformer = new IssueToNumberTransformer($this->om); 
      $builder->addViewTransformer($transformer); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'invalid_message' => 'The selected issue does not exist', 
     )); 
    } 

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

    public function getParent() 
    { 
     return 'field'; 
    } 

} 

데이터 변환기 클래스 :

class IssueToNumberTransformer implements DataTransformerInterface 
{ 

    /** 
    * @var ObjectManager 
    */ 
    private $om; 

    /** 
    * @param ObjectManager $om 
    */ 
    public function __construct(ObjectManager $om) 
    { 
     $this->om = $om; 
    } 

    /** 
    * Transforms an object (issue) to a array . 
    * 
    * @param Issue|null $issue 
    * @return array 
    */ 
    public function transform($issue) 
    { 
     if (null === $issue) 
     { 

      return array(
       'number' => 0, 
       'option' => 0 
        ); 
     } 

     return array(
      'number' => $issue->id, 
      'option' => 0 
     ); 
    } 

    /** 
    * Transforms a array to an object (issue). 
    * 
    * @param array $value 
    * @return Issue|null 
    * @throws TransformationFailedException if object (issue) is not found. 
    */ 
    public function reverseTransform($value) 
    { 
     if (null === $value) 
     { 
      return null; 
     } 

     if (!is_array($value)) 
     { 
      throw new UnexpectedTypeException($value, 'array'); 
     } 
     $number = $value['number'] ; 
     $option = $value['option'] ; 

     $issue = $this->om 
       ->getRepository('AcmeTransformerBundle:Issue') 
       ->findOneBy(array('id' => $number)) 
     ; 

     if (null === $issue) 
     { 
      throw new TransformationFailedException(sprintf(
          'An issue with number "%s" does not exist!', $number 
      )); 
     } 

     return $issue; 
    } 
} 
관련 문제