2016-12-24 252 views
0

我使用Sonata管理包并为页面上的某些字段键入了sonata_type_model。动态更改sonata_type_model字段的内容

我如何动态更改此字段中的元素列表?我需要根据另一个字段中的值更改此字段的内容。

例如,在类型为sonata_type_model的字段中显示了所有类别的东西。在页面的另一个字段中,我可以选择性别(M或F)。如果选择了性别的值,我如何自动更改字段的内容? 在此示例中,字段类型应用类型sonata_type_model非常重要,因为此类型允许选择现有类别并输入新类别。

回答

0

您应该使用表单事件来处理表单

Dynamic Generation for Submitted Forms

样品

功能的动态生成configureFormFields在管理类

$formBuilder = $formMapper->getFormBuilder(); 
     $currentUser = $this->getConfigurationPool()->getContainer()->get('security.token_storage'); 
$formMapper->add('driverCompany',null,array('class' =>'XXXXXBundle:Company')); 
       $formModifier = function (FormInterface $form, Company $oCompany = null, $defaultCompany) { 
        $company = null === $oCompany ? $defaultCompany : $oCompany; 
        $form->add(
         'zones', 
         null, 
         array(
          'class' => 'XXXXXXBundle:Zone', 
          'label' => 'Zones', 
          'multiple' => true, 
          'required' => false, 
          'placeholder' => '', 
          'query_builder' => function (ZoneRepository $zr) use ($company) { 
           return $zr 
            ->createQueryBuilder('z') 
            ->where('z.companyZone = ?1') 
            ->setParameter(1, $company); 
          }, 
         ) 
        ); 
       }; 
       $formBuilder->addEventListener(
        FormEvents::PRE_SET_DATA, 
        function (FormEvent $event) use ($formModifier, $defaultCompany) { 
         $data = $event->getData(); 

         if ($data !== null) { 
          if ($data->getDriverCompany() === null) { 
           $oCompany = null; 
          } else { 
           $oCompany = $data->getDriverCompany(); 
          } 
          $formModifier($event->getForm(), $oCompany, $defaultCompany); 
         } 
        } 
       ); 

       $formBuilder->get('driverCompany')->addEventListener(
        FormEvents::POST_SUBMIT, 
        function (FormEvent $event) use ($formModifier, $defaultCompany) { 

         $oCompany = $event->getForm()->getData(); 
         $formModifier($event->getForm()->getParent(), $oCompany, $defaultCompany); 
        } 
       );