【问题标题】:Symfony2 Form won't submit. Form name not in RequestSymfony2 表单不会提交。表单名称不在请求中
【发布时间】:2014-03-18 21:13:34
【问题描述】:

找到的解决方案:我没有在表单的构建器中指定方法。添加 setMethod("POST") 解决了我的问题。

我最近开始使用 Symfony2(并学习 TDD。我想我不太喜欢它)并且从今天早上开始我的表单就遇到了问题。它曾经有效,但现在我似乎无法得到有效的响应。

我设法稍微查明了错误。 Symfony 在 HttpFoundationRequestHandler 类中检查它是否应该处理请求(从第 56 行开始),第 59 行是它中断的地方

} elseif ($request->request->has($name) || $request->files->has($name)) {

所以如果我做对了,因为它在请求中找不到表单的名称,它只是忽略它,认为表单从未提交过。我不明白这是怎么可能的,因为唯一可能导致页面更改/刷新的是用户按下表单的“提交”按钮......

如果你们中的任何人对我的问题有什么建议或简单的指示,我将非常感激!

由于我对此一无所知,我将在我的 TrinomeClientVideoUploadForm 类和我的控制器内显示和处理表单请求的函数下方发布。

如果我用来构建表单的类就在这里:

<?php
namespace Trinome\WebVideoViewBundle\Model\Forms;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class TrinomeClientVideoUploadForm extends AbstractType
{
    private $name;

    public function __construct( $name = "trinome_client_video_upload" )
    {
        $this->name = $name;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder->add( "client", "text" )
                ->add( "video", "file" )
                ->add( "upload", "submit" );
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }
}

这是在我的(唯一的)控制器中处理页面的函数:

/**
 * @Route("/")
 * @Template()
 */
public function indexAction( Request $request )
{
    $uploadVideoForm = new UploadVideoFormDataSet();
    $form = $this->createForm( new TrinomeClientVideoUploadForm(), $uploadVideoForm );

    $form->handleRequest( $request );

    if ( $form->isValid() )
    {
        // It never gets here anyways, so I removed it for this post.
    }

    return array(
        "form" => $form->createView(),
    );
}

我在其中呈现表单的 Twig 文件:

{% extends "@BaseViews/base.html.twig" %}

{% block title %}Outil d'upload vidéo Trinome{% endblock %}
{% block stylesheets %}
    {% stylesheets '@TrinomeWebVideoViewBundle/Resources/public/css/*' filter='cssrewrite' %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
{% endblock %}

{% block body %}
    <div id="wrapper">
        <header>
            {% block header %}
                {% image '@logo_trinome' %}
                    <img src="{{ asset_url }}" alt="Logo Trinome" />
                {% endimage %}
            {% endblock %}
        </header>
        <div id="content">
            {% block content %}
                <h1>Connection</h1>
                {{ form( form ) }}
            {% endblock %}
        </div>
    </div>
{% endblock %}

【问题讨论】:

  • 显示渲染表单的树枝
  • 用 Twig 文件编辑了我的帖子。

标签: forms symfony request httprequest


【解决方案1】:

您不需要使用构造,尤其是因为您没有将控制器中的$name 变量作为参数传递。然后,您也可以删除私有财产。我不认为这是你的问题,而是没有必要。

在您的控制器中,当您调用 createForm 方法时,您并没有传递表单的操作或方法。我猜你的树枝正在渲染一个在开始表单标签上没有操作属性的表单。

关于您的表单类型,假设您尝试将对象(或实体)UploadVideoFormDataSet 绑定到您的表单,那么表单类型应该看起来更像这样:

TrinomeClientVideoUploadForm 类扩展 AbstractType { /** * @param FormBuilderInterface $builder * @param 数组 $options */ 公共函数 buildForm(FormBuilderInterface $builder, array $options) { $建造者 ->添加(“客户”,“文本”) ->添加(“视频”,“文件”) ->添加(“上传”,“提交”) ; } /** * @param OptionsResolverInterface $resolver */ 公共函数 setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(数组( 'data_class' => '命名空间\YourBundle\Entity\UploadVideoFormDataSet' )); } /** * @return 字符串 */ 公共函数 getName() { 返回'namespace_yourbundle_uploadvideoformdataset'; } }

希望对你有所帮助。

【讨论】:

  • 确实如此,结果证明没有 setMethod() 使它不起作用。我一添加它,我的表单就开始工作了。谢谢!
【解决方案2】:

尝试改变这个功能

public function getName()
{
    return "oww_yiss_it_works";
}

这是一个疯狂的猜测(我相信构造函数没有像你期望的那样工作)我对 symfony 不是很好,试着回到你改变的地方,你会发现问题所在是

【讨论】:

  • 我之前尝试过,但没有成功,而且我不喜欢这样硬编码。起作用的(似乎)是将 setMethod() 添加到我的 $builder 中。不过感谢您的帮助:)
猜你喜欢
  • 2018-04-17
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
相关资源
最近更新 更多