1

私は Symfony 2 のプロジェクトを引き継いでおり (私にはほとんど知識がありません)、既存のフォームの 1 つに問題があります。フォーム フィールドに既存のデータを事前入力する必要がありますが、そうしていません。なぜそれが機能しないのかについて、誰でも提案できますか?

私のコードは次のとおりです。

/**
* @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 %}

前もって感謝します!

4

1 に答える 1

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

編集:カスタマイズされている場合は、フォームクラスのコンストラクターでこれらの値の両方が必要になる可能性があるため、上記で問題が解決しない場合は、フォームクラスコードを追加してください。

于 2013-03-19T12:04:18.157 に答える