2017-06-29 74 views
2

我想有提交的JavaScript的一种形式,它仅包含一个复选框。但由于空的复选框不会发送请求中的密钥,因此Symfony不知道要提交的表单。那么还有没有那么疯狂的解决方案,或者是这种“bug”。Symfony的3.3复选框唯一形式没有提交

形式:

$newsletterForm = $this->formFactory->create(NewsletterType::class, $userToEdit); 
$newsletterForm->handleRequest($request); 

if ($this->newsletterFormHandler->handle($newsletterForm)) { 
    $this->session->getFlashBag()->add('notice', 'flash_message.newsletter_changed'); 

    return $response; 
} 

处理程序::

public function handle(FormInterface $form): bool 
{ 
    if (!$form->isSubmitted() || !$form->isValid()) { 
     return false; 
    } 

    $this->userManager->update($form->getData()); 

    return true; 
} 

视图:

{{ form_start(NewsletterForm) }} 

{{ form_row(NewsletterForm.subscribingNewsletter, { 
    attr: {class: 'js-newsletter-toggle'} 
}) }} 

{{ form_end(NewsletterForm) }} 

回答

1
控制器的

class NewsletterType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('subscribingNewsletter', CheckboxType::class, [ 
       'label' => 'form.label.newsletter', 
       'required' => false, 
      ]); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => User::class, 
     ]); 
    } 
} 

部分

所以我最终解决了这个问题。我发现得到这个工作的唯一方法是将您的提交按钮添加到您的代码是这样的:

class NewsletterType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('subscribingNewsletter', CheckboxType::class, [ 
       'label' => 'form.label.newsletter', 
       'required' => false, 
      ]) 
      ->add('submit', SubmitType::class); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => User::class, 
      ]); 
    } 
} 

不在您的看法。我是通过JavaScript提交表单,所以通过这种方式来模拟js中的按钮点击。