显示symfony表单

时间:2018-05-02 17:46:25

标签: php forms symfony post twig

我的表单有问题。

首先,在我的主要树枝中,我包括我用于表格的树枝:

 {% include 'MainBundle::manage.html.twig'%}

控制器是mainController

控制器显示主枝中出现的所有内容。

表格的行动:

public function manageAction(Request $request){

        $manageForm = $this->createFormBuilder()
        ->add('submitFile', FileType::class, array('label' => 'File to Submit'))
        ->add('send', SubmitType::class)->getForm();

        if ($request->getMethod('post') == 'POST') {
            // Bind request to the form
            $manageForm->bindRequest($request);

            // If form is valid
            if ($manageForm->isValid()) {
                // Get file
                $file = $manageForm->get('submitFile');

                $file->getData();
            }

        }
        return $this->render('MainBundle::main.html.twig', array(
            'manageForm' => $manageForm->createView()
        ));
    }

的routing.yml

manage:
    path: /manage
    defaults:
      _controller: MainBundle:Main:manage
    requirements:
      _method: POST

manage.html.twig

{% extends 'MainBundle::main.html.twig' %}
{% block content %}

<form action="" method="post">
        {{ form_widget(manageForm) }}
        <input type="submit" />
    </form>
{% endblock %}

当我在route / main中运行时,我应该显示表单,但是我有错误

  

变量“manageForm”不存在。

我猜控制器不接受视图......

3 个答案:

答案 0 :(得分:1)

在您的特定情况下 - 更改为以下内容。

return $this->render('MainBundle::manage.html.twig', array(
        'manageForm' => $manageForm->createView()
    ));

如果你在其他树枝上延伸主/基部树枝,那么你需要渲染另一根树枝(总是)。

您传递给扩展树枝的参数将在您已扩展的树枝中可用(在本例中为main.html.twig),但它不起作用。

{% include 'MainBundle::manage.html.twig'%} // why ?

不要对main做任何事情 - 只需将其扩展为manage !!!!

我也看到了整体代码的其他问题。

<强>控制器:          //更现代的方式,而不是手动检查请求方法

 if ($form->isSubmitted()) {
    if ($form->isValid()) {
      // perform actions...
    } else {
       // was not valid...return error messages 
     }
}

<强> FORM

<form action="" method="post"> // this is the oldschool way
    {{ form_widget(manageForm) }}
    <input type="submit" />
</form>

更好的东西......(我最近的一些编码例子)

  {{ form_start(form, {'attr' : {'method' : 'post', 'enctype' : 'multipart/form-data', 'class' : 'test'}}) }}
         {{ form_errors(form.resume) }}
         {{ form_widget(form.resume, {'attr' : {'id' : 'file-upload-rec', 'class' : 'file-upload-rec js-file-upload-rec', 'accept' : '.pdf, .doc, .docx'}}) }}
         {{ form_label(form.resume, 'select', {'label_attr' : {'class' : 'file-upload js-file-upload'}}) }}
         {{ form_row(form._token) }}
  {{ form_end(form, {'render_rest': false}) }}

PS。您可能还想阅读所有https://symfony.com/doc/current/forms.html

答案 1 :(得分:0)

您正在渲染main.html.twig而不是manage.html.twig。我想第一个使用importForm变量,因此不会传递给视图。

如果没有,并且您确实需要呈现包含main.html.twig的{​​{1}},那么为什么manage.html.twig会延伸manage.html.twig?要么彼此包含,要么彼此延伸,而不是两者兼而有之。

答案 2 :(得分:0)

您需要在包含模板的同时传递变量

{% include 'MainBundle::manage.html.twig' with {'manageForm': manageForm} %}

有关详细信息,请参阅https://twig.symfony.com/doc/2.x/tags/include.html

谢谢!