如何在Symfony中多次嵌入表单

时间:2016-08-09 08:29:52

标签: php forms symfony embed

我有两个实体:Tarifa和TarifaPeso(这个实体必须以Tarifa形式出现20次)。

塔里法的关系是:

    /**
 * @ORM\OneToMany(targetEntity="TarifaPeso", mappedBy="tarifa", cascade={"persist"})
 */
private $pesos;

我已经嵌入了这个表格,因为Symfony2 doc说的一切都没问题,但是我不想这样做,它只需要出现20次。所以Tarifa是一个表格,必须有20个TarifaPeso形式嵌入。

你知道怎么做吗?感谢

2 个答案:

答案 0 :(得分:2)

由于您维持@ORM\OneToMany关联,Collection Field Type应解决您的目的。您只需在生成表单之前将TarifaPeso的20个实例与Tarifa实体相关联。

See here如何嵌入集合表单类型。

确保您为自动cascade-persistTarifa insert个实体update实体TarifaPeso启用了Collection

根据我对IT 2000000 HR 2000000 IT 1950000 HR 2200000 Admin 1900000 IT 1900000 IT 2200000 字段类型的体验。在数据完整性方面,这将更快,更容易。

答案 1 :(得分:0)

最后我在父表单类的构造函数中(在实体中)完成了这个:

    $this->envios = new \Doctrine\Common\Collections\ArrayCollection();
    for ($i = 0; $i < count(self::$KILOS); $i++) {
        $peso = new TarifaPeso();
        $peso->setKilosMaxlim(self::$KILOS[$i]);
        $this->addPeso($peso);
    }

有$ KILOS:

private static $KILOS = array(1,2,3,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,300,500,1000,1001);

通过这种方式,我用这种方式用eventListener修改表单:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('precio', null, array(
            'attr' => array('autofocus' => true),
            'label' => 'label.precio ' ,
        ));
    ;

    $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();
        if ($data) {
            $valor = $data->getKilosMaxlim();

            $field = $form->get('precio');
            $config = $field->getConfig();
            $options = $config->getOptions();
            $options['label'] = 'Valor para '.$valor; // change the label
            $form->add($field->getName(), $config->getType()->getName(), $options);
        }
    });
}