2

symfony2 でフォーム フィールドを事前入力したい。URLはこんな感じ

http://localhost/Symfony/web/app_dev.php/clearance/new?projectId=6

フォームの projectId を 6 に設定したいと思います。

これが私のコントローラーコードです

 public function newclearanceAction(){
    $request = $this->getRequest();
    $id = $request->query->get('projectId');

    echo $id; //this works, but how to send it to the form?????

    $clearance = new Clearance();
    $form = $this->createForm(new ClearanceType(), $clearance);

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

            if($form->isValid()) {
                    $em = $this->getDoctrine()->getEntityManager();
                    $em->persist($clearance);
                    $em->flush();
                    return $this->redirect($this->generateUrl('MyReportBundle_project_list'));
            }
    }
    return $this->render('MyReportBundle:Clearance:new.html.twig',array('form'=>$form->createView()));

そして、これがフォームビューのコードです

<form action="{{ path('MyReportBundle_clearance_new') }}" method="post" >
        {{ form_errors(form) }}
        {{ form_rest(form) }}
    <input type="submit" />
</form>

助けてくれてありがとう!

4

1 に答える 1

4

これは、クリアランス エンティティに関連するプロジェクトがあるかどうかによって異なります。もしそうなら、あなたは次のようなことができます:

$request = $this->getRequest();
$id = $request->query->get('projectId');
$em = $this->getDoctrine()->getEntityManager();
$project = $em->getRepository("MyReportBundle:Project")->find($id)
$clearance = new Clearance();
$clearance->setProject($project);
$form = $this->createForm(new ClearanceType(), $clearance);

これにより、クリアランス オブジェクトにプロジェクトが設定され、フォームに渡されます。

現在、Symfony2 のエンティティに対して隠しフィールドを作成することはできないため、私の現在の修正は、クエリ ビルダー インスタンスを作成してフォームに渡すことです。これにより、100 のプロジェクトがある場合にプロジェクトのフォーム選択がばかげてしまいます。私が追加するアクションでこれを行うには:

$request = $this->getRequest();
$id = $request->query->get('projectId');
$em = $this->getDoctrine()->getEntityManager();

$repo = $em->getRepository("MyReportBundle:Project");
$project = $repo->find($id)
//create the query builder
$query_builder = $repo->createQueryBuilder('p')
     ->where('p.id = :id')
     ->setParameter('id', $project->getId());

$clearance = new Clearance();
$clearance->setProject($project);
//pass it through
$form = $this->createForm(new ClearanceType($query_builder), $clearance);

およびフォームクラスで:

protected $query_builder;

public function __construct($query_builder)
{
    $this->query_builder = $query_builder;
}

public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('Your field')
        // all other fields
        // Then below the query builder to limit to one project
        ->add('project', 'entity', array(
            'class' => 'MyReportBundle:Project',
            'query_builder' => $this->query_builder
        ))
    ;
}
于 2012-06-11T11:38:23.933 に答える