2017-06-29 73 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中的按鈕點擊。