在持久化之前将从表单收集的数据转换为实体

时间:2015-06-07 18:25:32

标签: php forms symfony orm

我是Symfony2的新手,只是通过一些现有的代码库来破解我的方式。我需要帮助来了解如何实现以下结果。

我有一个存储的PriceList实体:

DollarCostPrice, PercentDiscount1, PercentDiscount2, PercentCommission

我希望用户通过表单输入以下4个值:

SalePrice, DollarDiscount1Price, DollarDiscount2Price, PercentCommission

其中,

SalePrice = (DollarCostPrice + (PercentCommission * DollarCostPrice))

DollarDiscount1Price = ((DollarCostPrice + (PercentCommission * DollarCostPrice)) * (100 - PercentDiscount1)/100)

DollarDiscount2Price = ((DollarCostPrice + (PercentCommission * DollarCostPrice)) * (1 - PercentDiscount2)/100)

但是,一旦用户输入了上述值,我将计算需要在实体中保留的DollarCostPrice, PercentDiscount1, PercentDiscount2, PercentCommission

我想在表单中使用上述4个字段的集合,以便用户可以一次输入多个项目的此信息。

我在Symfony2中使用表单,集合和数据转换器仍然是新手。如果有人能帮我确定最佳方法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我会这样做。注意我在这里做出假设,例如,您没有提供有关哪些实体与PriceList相关的任何信息。

  1. 创建PriceListType表单类型,您将拥有1个映射字段(PercentCommission)和3个非映射字段(SalePrice,DollarDiscount1Price,DollarDiscount2Price)
  2. 添加非映射字段:

      

    - > add('SalePrice',null,array('mapped'=> false))

    我假设PriceList与某种SKU对象或类似对象有关系。您需要考虑如何管理这种关系。

    1. 从您的PriceList类型的基本表单开始。我会使用与this technique类似的内容来添加新的PriceList项目。
    2. 在保存时,我最初只是在控制器中进行实体计算,以便快速启动并运行例如。

          $yourForm->handleRequest($request);
          if ($yourForm->isValid()) {
      
              // loop through elements in your collection - note for non mapped fields
              // you need to access them like so: $form->get("DollarDiscount1Price")->getData();
      
              // calculate the data you wish to save to each PriceList entity, set and persist it
      
              $entityManager->persist($priceListEntity);
      
              // finish & finally flush
              $entityManager->flush();
          }
      

      然后我可能会将该功能移到表单事件监听器。

      我不认为自己需要数据转换器,因为它会增加复杂性。如果您计划以多种形式重复使用此功能,但我不认为我会担心它。

      人们会告诉你X是理想的解决方案,但是IMO开始时很简单,并且随时随地改进。