Php Symfony:一种形式的多个货币字段

Php Symfony:一种形式的多个货币字段,php,forms,symfony,currency,Php,Forms,Symfony,Currency,假设您有一个项目实体。在此项目实体中,有一种方法可以获取该项目的价格。价格以3种不同格式保存:欧元、美元和英镑 实体将如下所示: public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('title') .... ->add('prices', new WebshopPricesType()); }

假设您有一个项目实体。在此项目实体中,有一种方法可以获取该项目的价格。价格以3种不同格式保存:欧元、美元和英镑

实体将如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
     $builder
         ->add('title')
         ....
         ->add('prices', new WebshopPricesType());
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
     $builder
         ->add('eur', 'money', array('currency' => 'EUR', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'))
         ->add('usd', 'money', array('currency' => 'USD', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'))
          ->add('gbp', 'money', array('currency' => 'GBP', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'));
}
实体WebshopItem.php

class WebshopItem
{

    /**
     * @var integer
     */
    private $id;

    /**
     * @Gedmo\Translatable
     * @var string
     */
    private $title;

    ......

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $prices;
}
实体WebshopItemPrice.php

class WebshopItemPrice
{

    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $currency;

    /**
     * @var string
     */
    private $price;

    /**
     * @var \WebshopItem
     */
    private $webshopItem;
}
现在我想创建一个表单,它正好包含3个输入字段。因此,我认为最好是使用货币领域。因此,我创建的表单如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
     $builder
         ->add('title')
         ....
         ->add('prices', new WebshopPricesType());
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
     $builder
         ->add('eur', 'money', array('currency' => 'EUR', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'))
         ->add('usd', 'money', array('currency' => 'USD', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'))
          ->add('gbp', 'money', array('currency' => 'GBP', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'));
}
webshopPricesType如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
     $builder
         ->add('title')
         ....
         ->add('prices', new WebshopPricesType());
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
     $builder
         ->add('eur', 'money', array('currency' => 'EUR', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'))
         ->add('usd', 'money', array('currency' => 'USD', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'))
          ->add('gbp', 'money', array('currency' => 'GBP', 'data_class' => 'bundlePath\Entity\WebshopItemPrice'));
}
现在渲染3个正确的字段。我只需要在编辑时填写它们,保存时,我必须确保它们已保存。我在考虑使用数据转换器来找到正确的实体,但这不起作用

如何确保编辑时所有3个字段都已正确预填充,并且单击“保存”时,3个价格已保存

还是我应该用一种完全不同的方式


谢谢

我从来都不太喜欢
数据转换器
,因此我不会在这里使用它们,但它们可能很有用

在这种情况下,我将选择
FormEvents
,并根据实体包含的数据动态构建表单

WebShopItemType

WebshopPricesType

鉴于此,让我们把它粘在一起:
我已经在Notepad++中完成了这项工作,我不确定我是否有输入错误,但就逻辑而言,它应该可以工作;)

有趣的方法。我稍后会尝试让您知道它是否有效,如果有效,请将您的答案标记为已接受:)您的解决方案似乎很接近,但并不完全。我现在也在深入研究自己:表单的视图数据应该是scalar、array或\ArrayAccess的实例类型,但却是类Entity\WebshopItemPrice的实例。通过将“data_class”选项设置为“Entity\WebshopItemPrice”,或添加一个视图转换器,将类Entity\WebshopItemPrice的实例转换为标量、数组或\ArrayAccess.Ahh的实例,可以避免此错误,太好了!:)很高兴我能帮忙!:)