2016-12-24 250 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); 
        } 
       );