2017-04-11 1 views
0

ChoiceType을 확장하여 선택할 수있는 여러 개의 응용 프로그램 사용자 정의 역할 목록을 제공하는 RolesType을 작성했습니다. 내 역할이 config.yml에 정의 된 바와 같이내부에 사용자 정의 SF3 유형 편집

, 내가 같은 각 RolesType 사용을 위해 그것을 전달하는을 원하지 않는 대신

$builder 
->add('authorizedRoles', RolesType::class, [ 
       'label' => static::ROOT_TRANSLATION_PATH . ".roles.label", 
       'multiple' => true, 
       'expanded' => false, 
       'roles_list' => $roles, 
       'attr' => [ 
        'helper' => static::ROOT_TRANSLATION_PATH . ".roles.helper", 
       ] 
      ]) 

, 나는 분사하여이 선택 목록을 초기화하기 위해서 노력 roleType에 생성자의 역할 목록 :

public function __construct(array $rolesData) { 
     $this->rolesData = $rolesData; 

     foreach($this->rolesData as $roleId => $roleData) { 
      $this->rolesList[$roleData['label']] = $roleData['key']; 
     } 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->setAttribute('multiple', true); 
     $builder->setAttribute('expanded', false); 
     $builder->setAttribute('choices', $this->rolesList); 

     $options['multiple'] = true; 
     $options['expanded'] = false; 
     $options['choices'] = $this->rolesList; 

//  'multiple' => true, 
//  'expanded' => false, 
//  'choices' => $this->rolesList, 
    } 

    public function getParent() 
    { 
     return ChoiceType::class; 
    } 

당신은 매우 형태에 따라 행동하는 나의 실패 시도한다 을 볼 수 있습니다. 항상 내 역할을 원하기 때문에 항상 동일한 값을 갖는 여러 옵션과 확장 옵션을 원합니다. 여기에서이 옵션을 사용하는 것이 훨씬 좋습니다 (IMHO).

지금까지 속성 및 옵션은 실패했습니다. 빌더 (또는 양식 유형의 다른 곳에)를 어떻게 설정할 수 있습니까?

+0

에서 비슷한 예를있다 :

같은 것이 될 수 있다고? * 실패 *를 의미합니까? 오류가 있습니까? –

+0

예,이 양식을 서비스로 올바르게 등록했습니다. 방금 당신의 대답을 받아 들였고, 여기서 configureOption 목표에 대한 요점을 완전히 놓치고있었습니다. – nbonniot

답변

1

buildForm 대신 configureOptions의 기본값을 기본값으로 설정할 수 있습니다.

대신 buildForm의와 시도,하지만 생성자를 유지 :

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array( 
     'multiple' => true, 
     'expanded' => false, 
     'choices' => $this->rolesList, 
    )); 
} 

것은 적절한 태그를 서비스로 당신에게 사용자 지정 양식 유형을 등록해야합니다.

services: 
    app.form.type.roles: 
     class: AppBundle\Form\Type\RolesType 
     arguments: 
      - '%rolesList%' 
     tags: 
      - { name: form.type } 

사실 당신이 (적절한 태그를 선언) 서비스로 유형을 형성 등록 Symfony's Doc

+0

고마워. 내가 놓친 의사를 가리키는 +1. – nbonniot

0

당신이 제시 한 아이디어는 사용되지 않으며, 및

심포니 3. 제거 새 옵션을 추가하고 컨트롤러에서 역할의 배열을 전달할 수 있습니다. 이 옵션을 RoleType 클래스에 추가하는 방법입니다.

public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefined(array('roles_list')); 
     $resolver->setAllowedTypes('roles_list', 'array'); 
    } 

당신 말 :

옵션 리드이 작동하지 않을 경우

오류 메시지를 제공하지 못했습니다.

+0

정확하게 * 사용 중단되고 제거 된 *은 무엇입니까? 그건 그렇고, 당신은 동시에 무언가를 비난하고 제거 할 수 없습니다. –

+0

물론 동시에는 아닙니다. 간결함을 위해 쉼표를 추가했습니다. 나는 컨트롤러의 createForm()을 사용하는 폼을 만드는 것이지만 폼 타입의 인스턴스를 전달하는 것을 의미한다. Symfony 3에서는 정적 클래스 호출 만 사용합니다. –

+0

여전히 FormType의 생성자에 인수를 전달할 수 있지만이를 'form.type' 태그로 서비스로 등록해야합니다. 그게 다야. –

관련 문제