2016-06-16 2 views
2

Formform 클래스의 사용자 정의가 불충분 한 경우가 거의 없습니다.Symfony2 - FormType 클래스 사용자 정의

첫 번째 것은 stateuser 인 경우이 경우 활성화되어 있는지 확인해야 username을 편집 할 수 없습니다. 그러나 disabled 속성을 추가하는 것만으로 입력을 보호 할 수는 없습니다. 그래서 사용자 이름 입력 필드를 표시하지 않기로했습니다. 나는 부울을 옵션을 통해 전달함으로써 그것을 달성했다.

컨트롤러 :

$userForm = $this->createForm(UserType::class, $user, array(
    'is_active' => ($user->getState() == 'active') 
)); 

그리고 UserType을 클래스 :

if ($options['is_active']) { 
    $builder 
     ->add('username', EmailType::class); 
} 

$builder 
    ->add('firstName', TextType::class), 
... 

두 번째 경우는 내가 NotBlank() 제약 조건을 제거하고 프로필 사진이 업로드 될 때 FileType 필드에서 'required' => false 속성을 추가 할 필요가 있다는 것입니다. 나는 부울을 옵션을 통해 전달함으로써 비슷한 방식으로 그것을 달성했다.

컨트롤러 :

$userForm = $this->createForm(UserType::class, $user, array(
    'is_uploaded' => !empty($photo) 
)); 

UserType을 클래스 :

// achieved same way as previous problem 

내 질문

은 다음과 같습니다

  • 은 무엇 권고하는 경우 이러한 종류의 처리 할 것인가?
  • 내가 정확하고 수용 가능한 것은 무엇입니까?
  • 이러한 사례를 다루는 문서 또는 사례가 있습니까?

답변

2

이 양식 구성의 모든 논리를 양식 클래스로 이동할 수 있습니다. 당신이 양식에 $user 엔티티를 통과하기 때문에

: 다음

$user = $builder->getData(); 

양식 내부의 모든 condifions을 확인할 수 있습니다 더있다 :

$userForm = $this->createForm(UserType::class, $user, array(// <- $user is passed 
    'is_uploaded' => !empty($photo) 
)); 

당신과 builForm 방법에 액세스 할 수 없습니다 컨트롤러에 혼란을 일으킬 필요가있다.

+0

$ builder-> getData()에 대해 확실합니까? 지금까지 빌드 프로세스 중 양식 데이터를 얻는 유일한 방법은 청취자를 만드는 것과 관련이없는 양식 이벤트를 사용하는 것입니다. – Cerad

+0

** form **이 아닌 ** builder **에서 호출됩니다. 그것은 당신이 마음에 가지고있는 것과 같은'getData'가 아닙니다. 이것은 두 번째 매개 변수로서'createForm' 메쏘드 나 options 배열의'data' 항목 (3 번째 매개 변수)를 통해 전달하는 초기 데이터입니다. –

+0

멋져 보인다. 그래서 당신의 대답은 내가 내부 논리를 사용자 정의 할 수 있다는 것입니까? 그리고 당신이 제안한이 버전이 추천입니까? 제발 대답을 명확히하고 정확하게 하나 할당 할 것입니다 : –

관련 문제