2017-10-06 26 views
0

私は、チェックボックスを使用してエンティティタイプをフィルタするフォームを持っています。フォームが最初にレンダリングされると、チェックボックスはオフになります(false)。私がそれをチェックすると、正しくAJAXが起動し、エンティティが正しいサブセットで更新されます。Symfony3動的フォームのチェックボックス

ただし、チェックボックスをオフにすると、新しいエンティティが残ります。

コードを実行中に、AJAXリクエストがフォームに適切なtrue/falseを返すことを確認しました(プロファイラのPOSTパラメータは送信したものと同じです)。

すべてが横向きになっている場合は、POST_SUBMITリスナーにあります。これを記録することにより、$ event-> getForm() - > getData()は常に "1"または真です。 docsによれば、これは現在フォームを表すデータである必要があります。

私のフォーム上で定義されているチェックボックス:

$builder->add('businessAcct', CheckboxType::class, array(
    'required' => false, 
    'label' => ' ', 
    'label_attr' => array(
     'class' => 'middle', 
    ), 
)) ... 

マイリスナー:完全性について

$builder->get('businessAcct')->addEventListener(
    FormEvents::POST_SUBMIT, 
    function (FormEvent $event) use ($planModifier) { 
     $business = $event->getForm()->getData(); 

     $this->log->info($event->getForm()->getData()); // always produces 1 in profiler 

     $planModifier($event->getForm()->getParent(), $business); 
    } 
); 

マイ$ planModifier ...

$planModifier = function (FormInterface $form, bool $business) { 
    if ($business) { 
     $plans = $this->em->getRepository('AppBundle:Plan')->findAllBusinessPlans(); 
     $placeholder = '- select business plan -'; 
    } else { 
     $plans = $this->em->getRepository('AppBundle:Plan')->findAllResidentialPlans(); 
     $placeholder = '- select residential plan -'; 
    } 
    $form->add('plan', EntityType::class, array(
     'class' => 'AppBundle:Plan', 
     'choice_label' => 'description', 
     'placeholder' => $placeholder, 
     'choices' => $plans, 
     'label' => 'Plan:', 
     'label_attr' => array(
      'class' => 'text-right middle', 
     ), 
    )); 
}; 

AJAXコード:

var $bus_acct = $('#businessAcct'); 
$bus_acct.click(function() { 
    var $form = $(this).closest('form'); 
    var data = {}; 
    data[$bus_acct.attr('name')] = $bus_acct.is(':checked'); 
    $.ajax({ 
     url : $form.attr('action'), 
     type: $form.attr('method'), 
     data : data, 
     success: function(html) { 
      $('#plan').replaceWith(
       $(html).find('#plan') 
      ); 
     } 
    }); 
}); 

私は$ event-> getData()を試してみましたが、もちろん、それもうまくいきませんでした。

私はこのフォームに他のダイナミックフィールドを持っていますが、それらは問題なく動作します。

なぜ、$イベント - > getForm() - > getData()のアイデアは、常に '1'で、私のbusinessAcctチェックボックスには従っていませんか?

+0

ダンを使用して終了...私は十分な検索をしなかったと思います。明らかに、これは既知の問題です。 [https://github.com/symfony/symfony/issues/7139](https://github.com/symfony/symfony/issues/7139) – profm2

答えて

1

この問題に関する他人の問題を読んで、私が見つけた2つの共通の答えがあります。

オプション1:チェックボックスのためViewTransformerを作成

$builder->get('businessAcct') 
    ->addViewTransformer(new CallbackTransformer(
     function ($normalized) { 
      return ($normalized); 
     }, 
     function ($submitted) { 
      return ($submitted === '__false') ? null : $submitted; 
     } 
    )) 
; 

AJAX edit: 

data[$bus_acct.attr('name')] = $bus_acct.is(':checked') ? 'true' : '__false'; 

使用することによって、ここで何が起こっているか

->add('businessAcct', ChoiceType::class, array(
    'required' => true, 
    'choices' => array(
     'Yes' => true, 
     'No' => false, 
    ), 
    'label' => ' ', 
    'label_attr' => array(
     'class' => 'middle', 
    ), 
)) 

.... Twig edits not shown .... 

オプション2:ChoiceTypeにCheckboxTypeを変更 View Transformer、ブール値の代わりに文字列を返送しています。これはチェックされていないチェックボックスをサーバに送り返すブラウザの限界に起因します。ここで読んで良いがあります:https://github.com/symfony/symfony/issues/7139

私はオプション2

関連する問題