2014-09-19 1 views
0

entity 양식 유형을 사용하여 양식에 Position 엔티티 목록을 제공합니다. 필자는 더 자주 재사용 할 수 있도록 사용자 정의 양식 유형을 만들기로 결정한만큼 자주 (각 사용자가 동일한 "설정"코드를 사용하여) 충분히 사용합니다. Symfony2 : 맞춤 양식 유형의 동적 기본값은 무엇입니까?

class PositionType extends AbstractType 
{ 
    private $om; 

    public function __construct(ObjectManager $om, $mode) 
    { 
     $this->om = $om; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     // I need to pass "mode" as an option when building the form. 
     $mode = ??? 
     $query_builder = function (EntityRepository $em) use ($mode) { 
      // Limit the positions returned based on the editing mode 
      return $em 
       ->createQueryBuilder('Position') 
       ->orderBy('Position.name') 
       ->leftJoin('Position.type', 'Type') 
       ->andWhere('Type.id IN (:ids)') 
       ->setParameter('ids', Type::typesForMode($mode)) 
      ; 
     }; 

     $resolver 
      ->setRequired(array('mode')) 
      ->setDefaults(array(
       'label' => 'Position', 
       'class' => 'AcmeBundle:Position', 
       'property' => 'name', 
       'query_builder' => $query_builder, 
       'empty_value' => '', 
       'empty_data' => null, 
       'constraints' => array(
        new NotBlank(), 
       ), 
      )) 
     ; 
    } 

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

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

중요하지 않습니다 쿼리 빌더의 세부 사항에 대해 걱정하지 마십시오

여기에 현재 양식 유형입니다. 문제가되는 부분은 쿼리 작성기에서 양식 유형 옵션을 사용하려고하는 것입니다.

어떻게하면됩니까? 문제는 $mode (쿼리 작성기를 변경하기 위해 전달하려는 옵션)을 setDefaultOptions에 사용할 수 없다는 것입니다.

buildForm에서 쿼리 작성기를 설정하는 방법을 찾기 시작했으나이를 수행 할 수 있는지 잘 모르겠습니다.

답변

1

이것은 매우 쉽게 달성 할 수 있습니다. 다른 옵션에 따라 옵션을 만들 수 있습니다.

OptionResolver Component - Default Values that Depend on another Option

은 기본적으로 당신이 할 것입니다 :

$resolver 
    ->setRequired(array('mode', 'em')) // "em" for EntityManager as well 
    ->setDefaults(array(
     'label' => 'Position', 
     'class' => 'AcmeBundle:Position', 
     'property' => 'name', 
     ##################################################### 
     'query_builder' => function(Options $options){ 
      // Obviously you will need to pass the EntityManager 
      $em = $options['em']; 

      // Limit the positions returned based on the editing mode 
      return $em 
       ->createQueryBuilder('Position') 
       ->orderBy('Position.name') 
       ->leftJoin('Position.type', 'Type') 
       ->andWhere('Type.id IN (:ids)') 
       ->setParameter('ids', Type::typesForMode($options['mode'])) // 
      ; 
     }, 
     #################################### 
     'empty_value' => '', 
     'empty_data' => null, 
     'constraints' => array(
      new NotBlank(), 
     ), 
    )) 
; 

OptionsResolver이 할 수있는 단지 거친 표현입니다. 희망이 도움이 :) :)

+0

완벽하고 정확하게 필요한 것. 감사. – Brian

+0

엔티티 관리자를 전달하는 대신, 원래 호출 된 함수를 원래대로 반환합니다.이 함수는 Symfony – Brian

+0

에서 관리자에게 전달됩니다. 물론 환영합니다.) –

0

양식 옵션을 사용하여 변수를 양식 작성기로 전달할 수 있습니다.
예를 들어 컨트롤러;

public function createAction() 
{ 
    $form = $this->formFactory->create('client', $client, array('name' => 'create')); 

    return $this->template->renderResponse('bundle:add.html.twig', array('form' => $form->createView())); 
} 

귀하의 양식 유형;

class PositionType extends AbstractType 
{ 
    private $mode; 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $this->mode = $options['name']; 
    } 


    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     // I need to pass "mode" as an option when building the form. 
     $mode = ??? 
     $query_builder = function (EntityRepository $em) use ($this->mode) { 
      // Limit the positions returned based on the editing mode 
      return $em 
       ->createQueryBuilder('Position') 
       ->orderBy('Position.name') 
       ->leftJoin('Position.type', 'Type') 
       ->andWhere('Type.id IN (:ids)') 
       ->setParameter('ids', Type::typesForMode($mode)) 
      ; 
     }; 

     $resolver 
      ->setRequired(array('mode')) 
      ->setDefaults(array(
       'label' => 'Position', 
       'class' => 'AcmeBundle:Position', 
       'property' => 'name', 
       'query_builder' => $query_builder, 
       'empty_value' => '', 
       'empty_data' => null, 
       'constraints' => array(
        new NotBlank(), 
       ), 
      )) 
     ; 
    } 
} 
+0

하지만'setDefaultOptions'는'buildForm' 전에 호출되지 않습니다? – Brian

+0

@Brian 당신은 올바른 setDefaultOptions가 먼저 호출됩니다. constrcutor에서 변수를 옵션으로 전달하고 있습니까? – Rooneyl

관련 문제