如果未选中复选框(= 请求为空),则不处理 Symfony 表单
Symfony-form not treated, if checkboxes are unchecked (= request empty)
我有一个只有两个复选框的表单。当两者都未选中时,request
为空,因此提交的表单不会在控制器中处理。
知道吗,我如何才能 post 在 'unchecked' 复选框的请求中添加内容?
MyChoiceFormType
[...]
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('voucher_buy', CheckboxType::class, [
'label' => 'buy voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
->add('voucher_use', CheckboxType::class, [
'label' => 'use voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
;
}
[...]
控制器
[...]
// generate the FORM
$form = $this->createForm(MyChoiceFormType::class);
// handle the submitted FORM
$form->handleRequest($request);
if ( $form->isSubmitted() && $form->isValid() ) {
dd($form->getData()); // <-- not getting here, when both checkboxes are unchecked
// form shall be treated here and then
// redirect to another page
}
[...]
肮脏的骇客
我添加了一个 hidden-field,解决了这个问题。
MyChoiceFormType
[...]
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('voucher_buy', CheckboxType::class, [
'label' => 'buy voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
->add('voucher_use', CheckboxType::class, [
'label' => 'use voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
;
// as the from post will be empty, if both checkboxes are unchecked
// this dummy-field only ensures that at least something is in the
// posted form
$builder->add('dummy', HiddenType::class, [
'data' => 'only_dummy_data',
]);
}
[...]
我今天学到了一件事:未选中的复选框不会被传输。我不明白为什么,我有一个我需要传输错误值,因为我的意思是用它在 PRE_SUBMIT 上做一些事情。嗯,我有一个 choiceType 而不是复选框,它看起来不太漂亮,但它有效!
有同样的问题,不明白为什么没有未选中的复选框类型的选项值,如 'unchecked_value' => false。
我必须手动检查提交的字段,检查字段是否尚未提交然后我知道它在表单提交中丢失,这意味着它等于 false。
这是我的 class
public function setUncheckedReplacementFields(array $data)
{
foreach($this as $property => $value){
if(str_contains('Replacement', $property) !== false){
if(!in_array($property, $data)){
$method = sprintf('set%s', ucfirst($property));
if(method_exists(this, $method)){
$this->$method(false);
}
}
}
}
}
在我坚持形成之前 运行 这个
$object->setUncheckedReplacementFields($request->request->get($form->getName()));
因此,如果字段不是表单的一部分,我知道它已被取消选中,我遍历对象以找到那些复选框并将它们设置为 false,在我未选中的情况下。
我有一个只有两个复选框的表单。当两者都未选中时,request
为空,因此提交的表单不会在控制器中处理。
知道吗,我如何才能 post 在 'unchecked' 复选框的请求中添加内容?
MyChoiceFormType
[...]
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('voucher_buy', CheckboxType::class, [
'label' => 'buy voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
->add('voucher_use', CheckboxType::class, [
'label' => 'use voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
;
}
[...]
控制器
[...]
// generate the FORM
$form = $this->createForm(MyChoiceFormType::class);
// handle the submitted FORM
$form->handleRequest($request);
if ( $form->isSubmitted() && $form->isValid() ) {
dd($form->getData()); // <-- not getting here, when both checkboxes are unchecked
// form shall be treated here and then
// redirect to another page
}
[...]
肮脏的骇客
我添加了一个 hidden-field,解决了这个问题。
MyChoiceFormType
[...]
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('voucher_buy', CheckboxType::class, [
'label' => 'buy voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
->add('voucher_use', CheckboxType::class, [
'label' => 'use voucher',
'data' => false, // un-checked as default
'label_attr' => [
'class' => 'switch-custom' // Bootstrap-toggle (=switch-button)
],
])
;
// as the from post will be empty, if both checkboxes are unchecked
// this dummy-field only ensures that at least something is in the
// posted form
$builder->add('dummy', HiddenType::class, [
'data' => 'only_dummy_data',
]);
}
[...]
我今天学到了一件事:未选中的复选框不会被传输。我不明白为什么,我有一个我需要传输错误值,因为我的意思是用它在 PRE_SUBMIT 上做一些事情。嗯,我有一个 choiceType 而不是复选框,它看起来不太漂亮,但它有效!
有同样的问题,不明白为什么没有未选中的复选框类型的选项值,如 'unchecked_value' => false。
我必须手动检查提交的字段,检查字段是否尚未提交然后我知道它在表单提交中丢失,这意味着它等于 false。
这是我的 class
public function setUncheckedReplacementFields(array $data)
{
foreach($this as $property => $value){
if(str_contains('Replacement', $property) !== false){
if(!in_array($property, $data)){
$method = sprintf('set%s', ucfirst($property));
if(method_exists(this, $method)){
$this->$method(false);
}
}
}
}
}
在我坚持形成之前 运行 这个
$object->setUncheckedReplacementFields($request->request->get($form->getName()));
因此,如果字段不是表单的一部分,我知道它已被取消选中,我遍历对象以找到那些复选框并将它们设置为 false,在我未选中的情况下。