[英]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.