【问题标题】:Symfony 2 form not pre-populating with pre-saved dataSymfony 2 表单未预先填充预先保存的数据
【发布时间】:2013-03-08 02:06:09
【问题描述】:

我正在接手 Symfony 2 中的一个项目(我对此知之甚少),并且在使用其中一种现有形式时遇到了问题。它应该使用现有数据预先填充表单字段,但没有这样做。任何人都可以就为什么它可能不起作用提出建议吗?

这是我的代码:

/**
* @Route("/admin/pressrelease/{id}")
* @Template("ImagineCorporateBundle:Admin:Pressrelease/edit.html.twig")
*/
public function editAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();
    $repo = $em->getRepository('ImagineCorporateBundle:PressRelease');
    $pr = $repo->find($id);

    if(!$pr->getDocument())
    {
        $doc = new Document();
        $doc->setType('child');
        $doc->setTemplate('child');
        $pr->setDocument($doc);
    }

    $dateHelper = $this->get('helper.datehelper');
    $years = $dateHelper->dateRangeAction();
    $form = $this->createForm(new PressreleaseType(), array($pr , $years) );

    if($this->getRequest()->getMethod() == 'POST')
    {
        $form->bindRequest($this->getRequest());

        if($pr->getDocument())
        {
            $pr->getDocument()->setType('child');
            $pr->getDocument()->setTemplate('child');
            $pr->getDocument()->setTitle($pr->getTitle());
        }

        if($form->isValid())
        {
            $pr->upload('../web/upload/general/');
            $em->persist($pr);
            $em->persist($pr->getDocument());
            $em->flush();
            $pr->index(
                $this->get('search.lucene'),
                $this->generateUrl(
                    'imagine_corporate_pressrelease_view',
                    array('id' => $pr->getId(), 'title' => $pr->getTitle())
                )
            );

            return $this->redirect($this->generateUrl('imagine_corporate_pressrelease_admin'));
        }
    }

    return array('pressrelease' => $pr, 'form' => $form->createView());
}

还有视图模板:

{% extends "ImagineCorporateBundle:Admin:base.html.twig" %}

{% block heading %}Edit Press Release{% endblock %}

{% block content %}
<p>
    <a href="{{ path('imagine_cmf_attachment_new') }}">Upload Attachment</a> |
    <a href="{{ path('imagine_corporate_person_new') }}" target="_blank">New Person</a>
</p>

<form action="" method="post" {{ form_enctype(form) }}>

<div>
    {{ form_label(form.title) }}
    {{ form_errors(form.title) }}
    {{ form_widget(form.title) }}
</div>

<div>
    {{ form_label(form.author) }}
    {{ form_errors(form.author) }}
    {{ form_widget(form.author) }}
</div>

<div>
    {{ form_label(form.postdate) }}
    {{ form_errors(form.postdate) }}
    {{ form_widget(form.postdate) }}
</div>

<div>
    {{ form_label(form.imageUpload) }}
    {{ form_errors(form.imageUpload) }}
    {{ form_widget(form.imageUpload) }}
</div>

<div>
    {{ form_label(form.thumbnailUpload) }}
    {{ form_errors(form.thumbnailUpload) }}
    {{ form_widget(form.thumbnailUpload) }}
</div>

<fieldset>
    <div><input type="checkbox" class="checkallWebsites"> Check all</div>
    {{ form_label(form.websites) }}
    {{ form_errors(form.websites) }}
    {{ form_widget(form.websites) }}
</fieldset>

<fieldset>
    <div><input type="checkbox" class="checkallMagazines"> Check all</div>
    {{ form_label(form.magazines) }}
    {{ form_errors(form.magazines) }}
    {{ form_widget(form.magazines) }}
</fieldset>

 <fieldset>
    <div><input type="checkbox" class="checkallDept"> Check all</div>
    {{ form_label(form.department) }}
    {{ form_errors(form.department) }}
    {{ form_widget(form.department) }}
</fieldset>

<script>
    $(function () {
        $('.checkallWebsites').click(function () {
            $(this).parents('fieldset:eq(0)').find(':checkbox').attr('checked', this.checked);
        });
    });

    $(function () {
        $('.checkallMagazines').click(function () {
            $(this).parents('fieldset:eq(0)').find(':checkbox').attr('checked', this.checked);
        });
    });

    $(function () {
        $('.checkallDept').click(function () {
            $(this).parents('fieldset:eq(0)').find(':checkbox').attr('checked', this.checked);
        });
    });
</script>


{{ form_widget(form) }}

<div id="submit">
    <input type="submit" class="addnew-submit" />
</div>
</form>

{% endblock %}

提前致谢!

【问题讨论】:

  • 我知道我以前在使用 bindRequest 时遇到过问题,现在我在文档中看到它已被弃用为仅绑定。

标签: php forms symfony


【解决方案1】:

您的问题是控制器中的这一行:

$form = $this->createForm(new PressreleaseType(), array($pr , $years) );

如果您的表单是基于实体的,那么您可以将实体绑定到表单,只需像这样传递对象即可:

$form = $this->createForm(new PressreleaseType(), $pr);

如果它是一个更复杂的表单,那么你的数组需要是键值,表单字段名称作为键。例如(如果它们不同,您可能必须替换实际的字段名称,因为我们看不到您的表单类):

$form = $this->createForm(
    new PressreleaseType(),
    array(
        'press_release_name' => $pr->getName(),
        'years' => $years
    )
);

编辑: 如果自定义表单类的构造函数中可能需要这两个值,因此如果上述方法对您没有帮助,请添加您的表单类代码。

【讨论】:

  • 我用了这条线:$form = $this->createForm(new PressreleaseType(), $pr);它奏效了!我有点担心,因为我不太确定我删除的 $years 变量实际上在做什么。我似乎没有损坏任何东西,但我会留意它。感谢您的帮助。
  • 没问题,很高兴它有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多