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