簡體   English   中英

Symfony3動態表單復選框

[英]Symfony3 dynamic form checkbox

我有一個使用復選框過濾EntityType的表單。 首次呈現表單時,未選中該復選框(false)。 當我檢查它時,它會正確觸發我的AJAX,並使用正確的子集更新我的實體。

但是,當我然后取消選中該復選框時,將保留新實體。

在檢查代碼時,我已驗證AJAX請求已將正確的true / false發送回我的表單(探查器中的POST參數與我發送的正確)。

一切都擺在哪里,在POST_SUBMIT偵聽器中。 通過記錄此內容, $ event-> getForm()-> getData()始終為“ 1”或true。 根據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(),但當然也沒有用。

我在此表單上還有其他動態字段,並且這些字段工作正常。

關於為什么$ event-> getForm()-> getData()始終為“ 1”而不跟隨我的businessAcct復選框的任何想法?

通過閱讀有關此問題的其他人的問題,我發現了兩個常見的答案。

選項1:將CheckboxType更改為ChoiceType:

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

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

選項2:為復選框創建一個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';

這是怎么回事,通過使用View Transformer,我發回了一個字符串而不是一個布爾值。 這是由於瀏覽器將未選中的復選框發送回服務器的限制。 這里有很好的閱讀: https : //github.com/symfony/symfony/issues/7139

我最終使用了選項2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM