2016-09-08 3 views
3

Я Форма с 1 EntityType поля, которое должно содержать выбор в зависимости от второго поля EntityType, не отображаются в первой сущности, как это:Symfony - FormType - Динамический выбор

ServicePlaceType.php:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('placetype', EntityType::class, array(
      "class" => "AppBundle:PlaceType", 
      "choice_label" => "place", 
      "mapped" => false 
     )) 
     ->add('idplace', EntityType::class, array(
      "class" => "AppBundle:Place", 
      "choice_label" => "place" 
     )) 
     ->add('...'); 

таблицы

+---------+--------------+---------------+-----------+ 
| Service | ServicePlace |  Place  | PlaceType | 
+---------+--------------+---------------+-----------+ 
|   | id   |    |   | 
+---------+--------------+---------------+-----------+ 
|   | idplace > | < id   |   | 
+---------+--------------+---------------+-----------+ 
| id > | < idservice | idPlaceType > | < id  | 
+---------+--------------+---------------+-----------+ 
| service |    | place   | placetype | 
+---------+--------------+---------------+-----------+ 

Так что, когда я выбрать PlaceType я хочу, чтобы Место выберите шоу только те места, где idplacetype соответствуют PlaceType идентификатор.

Я попытался в javascript с событием onChange в выборе PlaceType, который фильтрует параметры Place в соответствии с фактическим значением PlaceType, но я не знаю, как получить свойство PlaceType для Place в formType. я пытался что-то вещи, но он не работает

->add('idplace', EntityType::class, array(
      "class" => "AppBundle:Place", 
      "choice_label" => "place", 
      "attr" => array("placeType" => $this->getPlaceType()), // nor like that 
)) 

    ->add('idplace', EntityType::class, array(
      "class" => "AppBundle:Place", 
      "choice_label" => "place", 
      "attr" => array("placeType" => function ($place) { 
       return $place->getPlaceType(); 
      }), // neither like that 
    )) 

ли кто-нибудь знает, как извлечь эти ДАННЫЕ? Или как динамически фильтровать параметры по-другому?

Спасибо за помощь!

+0

try wih 'choice_label' => 'placeType', – mmmm

+0

Спасибо за идею. Я подумал об этом, но мне нужно, чтобы на лейбле было место! – Boulboulouboule

+0

это сработало? :) – mmmm

ответ

2

Вы можете сделать это с jquery библиотеки немного более простой:

Во-первых, мы изменяем строитель немного для визуализации места типа идентификатора в <option data-type="..."> используя choice_attr вариант:

$builder 
    ->add('placetype', EntityType::class, array(
     "class" => "AppBundle:PlaceType", 
     "mapped" => false 
    )) 
    ->add('idplace', EntityType::class, array(
     "class" => "AppBundle:Place", 
     'choice_attr' => function ($place) { 
      // output: <option data-type="...">...</option> 
      return array('data-type' => $place->getPlaceType()->getId()); 
     }, 
    )) 

Далее в вашем шаблоне:

{# ... #} 

{{ form(form) }} 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 
<script> 
    // when the 1st <select> was changed, then update the 2nd 
    // from current value and data-type option attribute. 
    $(document).on('change', '#form_placetype', function() { 
     var $idplace = $('#form_idplace'), 
      // current value 
      placetype = $(this).val(), 
      // select available options from current value 
      $available = $idplace.find('option[data-type="' + placetype + '"]'); 

     // deselect when the 1st <select> has changed. 
     $idplace.val(''); 
     // hide no available options from current value 
     $idplace.find('option').not($available).hide(); 
     // show available options from current value 
     $available.show(); 
    }); 

    // Update 2nd <select> on page load. 
    $('#form_placetype').trigger('change'); 
</script> 
+1

'choice_attr' было решением! Я хочу обнять тебя прямо сейчас :) – Boulboulouboule

Смежные вопросы