Форма Symfony недействительна и не может быть отправлена

При попытке отправить мою форму, она не работает. Кнопка вообще ничего не делает. Итак, я попытался сбросить что-то с моим:

if ($form->isValid() && $form->isSubmitted())

И понял, что он даже не входит в оператор if, поэтому я предполагаю, что с моей формой что-то не так. Но я еще не могу понять, что это будет, поэтому я был бы рад, если бы кто-нибудь мог мне помочь!

 /**
  * @Route("/document/bulkdeactivate", name="documentBundle_document_bulkDeactivate")
  * @Template()
  */
  public function bulkDeactivateAction(Request $request) {
      $em = $this->getDoctrine()->getManager();
      $selected_documents = $request->request->all();
      $form = $this->createForm(DocumentDeactivationType::class);
      $form->handleRequest($request);
        if ($form->isValid() && $form->isSubmitted()) {
          foreach($selected_documents as $document) {
          $documentR = json_decode(json_encode($document), true);
          dump($documentR);
            for($i=0; $i<count($documentR); $i++){
              $doc = $em->getRepository('DocumentBundle:Document')->findOneById($documentR[$i]);
              dump($doc);
              $doc->setActive(false);
              $em->persist($doc);
              $em->flush();
            }
          }
          $this->addFlash(
            'success',
            'The document has been deactivated!'
          );
          return $this->redirectToRoute('documentBundle_document_list');
        }
        return $this->render('DocumentBundle:Panels:ActivationPanel.html.twig', array(
          'form' => $form->createView(),
        ));
  }

мой тип формы:

public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
    ->add('documentlist', EntityType::class, array(
      'class' => 'DocumentBundle:Document',
      'choice_label' => 'name',
      'required' => false,
      'multiple' => true,
      'expanded' => false,
      'placeholder' => "Select Documents",
      'label' => 'label.document_list',
        ))

->add('submit', SubmitType::class, array(
  'label' => 'Submit',
  'attr' => array(
      'class' => 'btn btn btn-default',
  ),
  ));
  }

И часть формы моего шаблона ветки:

     {% block content %}
    {{ form_start(form) }}
     {{ form(form.documentlist) }}
 {{ form(form.submit) }}
    {{ form_end(form) }}

    {% endblock content %}

Должны быть какие-то проблемы с формой, у вас есть какой-нибудь совет для меня?


person sonja    schedule 03.10.2017    source источник
comment
Ну ошибки должны отображаться в вашем шаблоне. Проверьте панель отладки формы и этот вопрос, чтобы вручную отобразить ошибки формы: symfony2 неверная форма без ошибок"> stackoverflow.com/questions/11208992/   -  person COil    schedule 03.10.2017
comment
Я уже использовал метод формы getErrors(), и результатом является пустой массив.. FormErrorIterator {#1586 ▼ -form: Form {#1570 ▶} -errors: [] }   -  person sonja    schedule 03.10.2017
comment
Ваше сохранение не связано с формой, поэтому Symfony не должен его распознавать. Вы пытались добавить его в свой buildForm? Например: $builder->add [..] ->add('save',Symfony\Component\Form\Extension\Core\Type\SubmitType::class ) Затем удалите свой Submit из шаблона Twig и замените его на {{ form_widget(form.save, { 'attr': {'class': 'btn btn-default'} }) }}, и это должно сработать.   -  person NaeiKinDus    schedule 03.10.2017
comment
Кроме того, запрос дважды одного и того же не поможет (см. кнопка не работает"> stackoverflow.com/questions/46544593/).   -  person NaeiKinDus    schedule 03.10.2017
comment
Возможный дубликат кнопка отправки формы Symfony не работает   -  person NaeiKinDus    schedule 03.10.2017
comment
@NaeiKinDus да, я уже пробовал это, но потом получил ошибку, что методы не существуют в моем макете формы. Хотя я никогда не использовал переменную с именем method. Я почти уверен, что это как-то связано с моей логикой? и я задал его дважды, потому что я понял, что я не правильно сформулировал свой вопрос и, таким образом, попытался дать другие намеки.   -  person sonja    schedule 03.10.2017
comment
Тогда нужно было отредактировать ваш вопрос :) Не могли бы вы вставить точное сообщение об ошибке в свой вопрос? И модифицированный код тоже. Добавление {{ form_rest(form) }} для целей отладки также может помочь.   -  person NaeiKinDus    schedule 03.10.2017
comment
@NaeiKinDus Я обновил свой код, и это сообщение об ошибке: метод переменной не существует. в vendor/symfony/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig в строке 271   -  person sonja    schedule 03.10.2017
comment
Давайте продолжим обсуждение в чате.   -  person NaeiKinDus    schedule 03.10.2017


Ответы (2)


На самом деле вопросов несколько:

  • вы не можете добавить кнопку отправки, которая не привязана к форме Symfony в вашем случае, потому что Symfony не идентифицирует ее должным образом (из-за отсутствия имени, которое должно соответствовать автоматической генерации входных имен SF)

В вашем formBuilder поместите:

$builder->add('submit', SubmitType::class);
  • ваша форма имеет неправильное имя («форма»), которое конфликтует с функцией form() Twig, вы должны изменить его,
  • у вас может быть проблема (не проверенная, просто предположение) относительно многих вызовов, сделанных в Twig form(), потому что эта функция выгружает все содержимое формы, чтобы вручную сбросить каждую часть использования

Ваш {% block content %} должен иметь это:

{{ form_widget(form.your_widget_name, attrs) }}
person NaeiKinDus    schedule 03.10.2017

В конце концов я решил свою проблему: 1. как указал @NaeiKinDus, мне нужна была кнопка «Отправить», которая фактически принадлежала моей форме, плюс я изменил имя своей формы на пользовательскую deactivationForm

{% block content %}
{{ form(deactivationForm) }}
{% endblock content %}

метод сборки формы:

    $builder
->add('documentlist', EntityType::class, array(
  'class' => 'DocumentBundle:Document',
  'choice_label' => 'name',
  'required' => false,
  'multiple' => true,
  'expanded' => false,
  'placeholder' => "Select Documents",
  'label' => 'label.document_list',
  'translation_domain' => 'Documents',
  'query_builder' => function (EntityRepository $er) {
    return $er->createQueryBuilder('d')
      ->where('d.active = FALSE');
    },
))

->add('submit', SubmitType::class, array(
  'label' => 'Submit',
  'attr' => array(
      'class' => 'btn btn btn-default',
  ),
  ));

затем в моем контроллере:

/**
  * @Route("/document/bulkdeactivate", name="documentBundle_document_bulkDeactivate")
  * @Template()
  */
  public function bulkDeactivateAction(Request $request) {

    /*
      * GET DOCUMENT FROM DB
      */
      $em = $this->getDoctrine()->getManager();
      $selected_documents = $request->request->all();

      $deactivationForm = $this->createForm(DocumentDeactivationType::class);
      $deactivationForm->handleRequest($request);
        if ($deactivationForm->isValid() && $deactivationForm->isSubmitted()) {
          foreach($selected_documents as $document) {
          $documentR = json_decode(json_encode($document), true);
          dump(count($documentR['documentlist']));
            for($i=0; $i<count($documentR['documentlist']); $i++){
              $doc = $em->getRepository('DocumentBundle:Document')->findOneById($documentR['documentlist'][$i]);
              dump($documentR['documentlist'][$i]);
              $doc->setActive(true);
              $em->persist($doc);
              $em->flush();
            }
          }
          $this->addFlash(
            'success',
            'The selected document(s) have been deactivated!'
          );
          return $this->redirectToRoute('documentBundle_document_list');
          }

        return $this->render('DocumentBundle:Panels:ActivationPanel.html.twig', array(
          'deactivationForm' => $deactivationForm->createView(),
        ));
}

Я пытался получить доступ к неправильным позициям массива (я не осознавал, что декодирование данных ajax отправило мне 3 позиции массива, но я хотел получить доступ только к первому «списку документов», а затем получить идентификаторы документов из него.

person sonja    schedule 03.10.2017