在Symfony2中为实体类型设置默认值

6

我不知道如何为Symfony2中的实体类型设置默认值。我的代码看起来像这样:

$rewardChoice = $this->createFormBuilder($reward)
    ->add('reward_name', 'entity', array(
        'class' => 'FuelFormBundle:Reward',
        'property' => 'reward_name',
        'data' => 2,
        'query_builder' => function(EntityRepository $er){
            return $er->createQueryBuilder('r')
                ->where('r.active = 1')
                ->groupBy('r.reward_id')
                ->orderBy('r.reward_name', 'DESC');

        },
    ))
    ->getForm();

然而,为了使它正常工作,您需要提交您正在使用的对象。我的答案如下。

我发现许多不同的答案,但它们都重新构建了表单的方式。这种方法更加简单。

4个回答

9

我发现很多答案都可以使它工作,但是所有这些答案似乎都需要重新构建表单。然而,我发现将对象设为已完成的状态最为有效,因此我决定发布我的解决方案,以防别人再次遇到此问题。

以下是我的控制器代码:

// this is setting up a controller and really isn't important 
$dbController = $this->get('database_controller');

// this is getting the user id based on the hash passed by the url from the
// database controller
$user_id = $dbController->getUserIdByHash($hash);

// this is getting the Reward Entity.  A lot of times you will see it written as 
// $reward = new Reward however I am setting info into reward right away in this case
$reward = $dbController->getRewardByUserId($user_id);


$rewardChoice = $this->createFormBuilder($reward)
    ->add('reward_name', 'entity', array(
        'class' => 'FuelFormBundle:Reward',
        'property' => 'reward_name',

        // I pass $reward to data to set the default data.  Whatever you
        // assign to $reward will set the default value.  
        'data' => $reward,  
        'query_builder' => function(EntityRepository $er){
                return $er->createQueryBuilder('r')
                    ->where('r.active = 1')
                    ->groupBy('r.reward_id')
                    ->orderBy('r.reward_name', 'DESC');
        },
    ))
    ->getForm();

希望这能让事情更加清晰。我看到了很多相同的问题,但没有一个解决方案像这样。


6
最好的方法是在创建表单之前设置奖励名称。例如:
$reward->setRewardName('your_relationship_reference_here');

$rewardChoice = $this->createFormBuilder($reward)

使用data字段可能会导致问题。

是的,看起来你的解决方案是最优雅的。关于“data”: “...这意味着当表单编辑已经持久化的对象时,对象值也被覆盖,导致在提交表单时失去其持久化值。” 另一方面,“empty_data”不影响表单的显示-它只在提交时提供默认值。 - DamirR
1
是的,这应该只在创建新实体时完成,当您编辑时不要设置默认值。 - nacholibre

3

对于Symfony 4,我们可以使用 'placeholder' => '选择一个选项'。

->add('reward_name', EntityType::class, array(
                    'class' => Reward::class,
                    'choice_label' => 'name',
                    'placeholder' => 'Choose an option',
                ))

1
从表单的目标对象初始化值。
$article=2/*Id of item that you wont to set as default*/    
$stock->setArtigo($this
                ->getDoctrine()
                ->getManager()
                ->getRepository('AppBundle:Artigo')
                ->find($article));

            $form = $this->createForm('AppBundle\Form\StockType', $stock);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接