我正在开发一个电子商务平台,遇到了一个困难。基本上,我在我的场景中有一个产品、选项和选项值。一个产品可能有多个选项,这些选项可能具有多个值。问题是如何以易于创建和编辑的方式存储它。
问题是我直接引用了 OptionValue,它是可变的。我需要保留有关 Option 和 OptionValue 的不可变信息(例如,如果下订单并且颜色为绿色,即使此选项更改为浅绿色,订单也必须保持显示为绿色)。在这种情况下,我需要保存选项的一些属性(例如选项名称 - “颜色”)和每个选项值(每个选项的值 - 例如“红色”)。我认为,它需要一个与现有结构非常相似的结构:一个新的类 ItemOption 引用 Option 和一个 ItemOptionValue 引用 OptionValue。
所以,这是我的尝试:
要创建一个表单来显示我的选项,我有:
class OptionSelectorType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
foreach ($options['product']->getOptions() as $option) {
$builder->add($option->getId(), 'choice', array('choice_list' => new ObjectChoiceList($option->getValues());));
}
}
}
我正在使用 DataTransformer 转换 OrderItemOption 集合中的 OptionValue 集合:
class OrderItemOptionToOptionValueTransformer implements DataTransformerInterface
{
public function transform($lineOptions)
{
if(!$lineOptions) {
return array();
}
$values = array();
foreach($lineOptions as $lineOption) {
$lineOption->getOption()->getId();
$values[$id] = array();
foreach($lineOption->getValues() as $lineOptionValue) {
$values[$id][] = $lineOptionValue->getOptionValue();
}
}
return $values;
}
public function reverseTransform($values)
{
$collection = new ArrayCollection();
foreach($values as $optionId => $optionValues) {
if(!$optionValues) {
continue;
}
$lineOption = new OrderItemOption();
$optionValues = is_array($optionValues) ? $optionValues : array($optionValues);
foreach($optionValues as $optionValue) {
$lineOptionValue = new OrderItemOptionValue();
$lineOptionValue->setOptionValue($optionValue);
$lineOption->addValue($lineOptionValue);
}
$lineOption->setOption($optionValue->getOption());
$collection->add($lineOption);
}
return $collection;
}
}
最后,我的 OrderItemType 表单:
class OrderItemType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
$builder->create('options', 'option_selector', array('options' => $options['options']))
->addModelTransformer(new OrderItemOptionToOptionValueTransformer())
);
}
}
它有效,但在我看来不是一个好方法,一旦 OptionValue 总是被重新创建,永远不会更新。
你会怎么做?