使用获取数据预填表格

时间:2012-06-11 11:23:46

标签: forms symfony

我想在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>

感谢您的帮助!

1 个答案:

答案 0 :(得分: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
        ))
    ;
}