Php 如何在Symfony中多次嵌入表单
我有两个实体:塔里法和塔里法佩索(这一个必须以塔里法的形式出现20次) Tarifa中的关系为:Php 如何在Symfony中多次嵌入表单,php,forms,symfony,embed,Php,Forms,Symfony,Embed,我有两个实体:塔里法和塔里法佩索(这一个必须以塔里法的形式出现20次) Tarifa中的关系为: /** * @ORM\OneToMany(targetEntity="TarifaPeso", mappedBy="tarifa", cascade={"persist"}) */ private $pesos; 我已经嵌入了Symfony2文件所说的形式,一切都很好,但我不想这样做,它只出现了20次。所以塔里法是一种形式,必须嵌入20塔里法比索形式 你知道怎么做吗?谢谢因为您维护了一
/**
* @ORM\OneToMany(targetEntity="TarifaPeso", mappedBy="tarifa", cascade={"persist"})
*/
private $pesos;
我已经嵌入了Symfony2文件所说的形式,一切都很好,但我不想这样做,它只出现了20次。所以塔里法是一种形式,必须嵌入20塔里法比索形式
你知道怎么做吗?谢谢因为您维护了一个
@ORM\OneToMany
关联,应该可以解决您的问题。在生成表单之前,只需将20个TarifaPeso
实例与Tarifa
实体关联即可
如何嵌入集合表单类型
确保已从Tarifa
实体启用了cascade persist
,以自动插入insert
或update
TarifaPeso
实体
根据我对
集合
字段类型的经验。就数据完整性而言,这将更快更容易。最后,我在父表单类的构造函数(在实体中)中完成了这项工作:
通过这种方式,我使用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);
}
});
}
您不使用实体类“Tarifa”作为表单的底层数据类,而是创建另外两个类,例如“[您的包]/form/Model/Tarifa”和“[您的包]/form/Model/TarifaPeso”。然后将20个TarifaPeso实例添加到Tarifa并显示表单。提交表单时,从Tarifa中选择所有数据,实例化并存储实体。为此提供服务,不要在控制器中进行。
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);
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);
}
});
}