2016-07-08 1 views
4

Symfony 프로젝트에서 FormEventSubscriber를 여러 가지 형태로 사용합니다.FormField에서 FormField에 전달 된 옵션 얻기

이미 채워진 각 입력란을 사용 중지하는 것이 목표입니다. 내가 사용하는 가입자에

:

$childOptions = $child->getConfig()->getOptions(); 

나는 아이에 대한 모든 해결 옵션을받을, 나는 양식 건물 중 통과 만 얻을 싶어요. (일부 FormType (i.o. DocumentType)을 양식하기 때문에 모든 해결 옵션을 재 분사 할 수 없기 때문에 문제가 발생합니다.

  • FormType 예 :

  • 가입자는 :

    class ChangesSubscriber implements EventSubscriberInterface 
    { 
        // Disables filled inputs 
        public function postSetData(FormEvent $event) 
        { 
         $form = $event->getForm(); 
    
         foreach($form->all() as $child) 
         { 
          $childName = $child->getName(); 
          $childType = $child->getConfig()->getType()->getName(); 
    
          // Here I receive all resolved options 
          // But I only want the options passed above during 'buildForm' ('class','choice_label') : 
          $childOptions = $child->getConfig()->getOptions(); 
    
          if(!$child->isEmpty()){ 
           $form->add($childName,$childType,array_merge($childOptions,array('disabled'=>true))); 
          } 
         } 
        } 
    } 
    

이것은 많은 사용 사례의 일 예이며, 다른 예는 같을 수 Alsatian\FormBundle ExtensibleSubscriber

-> AJAX가 선택/실체/문서 유형에 대한 선택을 수락 할 수 있도록 서류 작성자. 지금까지 알 수 있듯이 몇 가지 해결 옵션 만 선택했지만이 솔루션에 만족하지 않습니다.

+0

아마도 전역 양식이 아닌 필드 자체에 구독자를 추가해야합니다. $ builder-> get ("entity") -> addEventSubscriber ($ this-> changesSubscriber)'를 호출하십시오. 그에 따라 구독자를 수정해야하므로 아마 더 이상 반복 할 필요가 없습니다. – VaN

+0

가입자가 아이에있을 때, 아이를 '다시 만들 수 없습니다.'옵션을 편집하여 '비활성화 됨'을 추가 할 수 없습니다. – Alsatian

+0

구독자 대신 양식 유형 확장을 사용 해본 적이 있습니까? – Heah

답변

1

접근 방식을 변경해야하는 것처럼 들립니다.

아마도 사용자 정의 양식 유형을 만들 수 있으며 그 중 일부 옵션은 원래 형식을 만드는 옵션이되어야합니다 (CollectionType과 유사).

은 어쩌면 조금 다음과 같습니다

->add('entity', AjaxType::class,array( 'ajax_type' => EntityType:class, 'ajax_options' => [ 'class' => 'AppBundle:User', 'choice_label' => 'username', ] ))

그 유형이 데이터를 수신하고 무엇을 결정하는 이벤트를 추가 할 수 있습니다.

+0

좋은 생각인데, 그런 종류의 양식 이벤트를 사용하여 각 유형의 FormType (텍스트, 선택 사항, 엔티티, 문서 등)을 수정합니다. 그래서 심포니에 기능 요청을 작성했습니다. 그런 다음 양식을 작성하는 동안 어딘가에 저장하면 '통과'옵션을 직접 얻는 것이 더 쉬울 것입니다. – Alsatian