【问题标题】:Display symfony form显示 symfony 表单
【发布时间】:2018-05-02 17:46:24
【问题描述】:

我的表单有问题。

首先,在我的主要树枝中,我包含了我用于表单的树枝:

 {% 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 %}

当我在路线 /main 中运行时,我应该显示我的表单,但我有一个错误

变量“manageForm”不存在。

我猜控制器没有取景...

【问题讨论】:

    标签: php forms symfony post twig


    【解决方案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 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

    【讨论】:

      【解决方案2】:

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

      如果不是,你确实需要渲染包含manage.html.twigmain.html.twig,那么为什么manage.html.twig 扩展main.html.twig?要么将一个包含在另一个中,要么将一个从另一个扩展,而不是两者兼而有之。

      【讨论】:

      • 对不起,这不是好的错误,错误是“变量“manageForm”不存在。”如果我改变渲染它是同样的错误..
      • 您是否也从您的 main.html.twig 中删除了包含?如果您的管理模板正在扩展主模板,则无需包含在其中
      • 但是如果我不将它包含在主树枝中,它将如何显示?
      • 你没有将它包含在 main.js 中。你从你的管理中扩展主要。
      • 您在 manage.html.twig 中扩展它。只需在您的内容块中添加 {{ parent() }} 即可从父 (main.html.twig) 模板的内容块中检索所有内容。检查此以供参考:twig.symfony.com/doc/2.x/tags/extends.html
      【解决方案3】:

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

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

      欲了解更多信息,请参阅https://twig.symfony.com/doc/2.x/tags/include.html

      谢谢!

      【讨论】:

      • 我认为他不想这样做 - 只有当他希望表单显示在所有页面中时。例如,考虑到他的主模板包含导航。
      • 在他的问题中,他说变量“manageForm”不存在。”我的回答中提到了这样做的原因。如果他的设计适合他打算做的事情,那是另一个争论。谢谢!
      • 是的,我看到了人,但他的做法和想法都错了。通常您定义一个基本/主模板,然后扩展它并将每个页面的唯一内容放置在每个扩展模板中。
      • 我明白你的意思,这是正确的。我刚刚回答了错误的原因。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多