Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Symfony中多次嵌入表单_Php_Forms_Symfony_Embed - Fatal编程技术网

Php 如何在Symfony中多次嵌入表单

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塔里法比索形式 你知道怎么做吗?谢谢因为您维护了一

我有两个实体:塔里法和塔里法佩索(这一个必须以塔里法的形式出现20次)

Tarifa中的关系为:

    /**
 * @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);
        }
    });
}