Symfony 2不预先填充预先保存的数据

时间:2013-03-19 11:54:33

标签: php forms symfony

我接手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 %}

提前致谢!

1 个答案:

答案 0 :(得分:3)

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

$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
    )
);

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