1

カスタマイズ可能な製品を使用した電子商取引システムを開発しています。各製品には、消費者が選択した 1 つまたは複数の値を持つオプションがいくつかある場合があります。ユーザーのカスタマイズのレベルが高いため (一部の製品には 100 万を超えるバリエーションがある可能性があります)、バリアント アプローチを使用できないため、顧客が選択したオプションの組み合わせを保持する必要があります。

各製品に個別のオプションがある場合は、フォーム オプションが動的に組み立てられます。このフォームは、ユーザーの選択をリレーショナル データベースの格納可能な構造に変換する必要があります。

基本的に、それは私のシナリオです(私の試み):

  • 製品
  • オプション
  • オプション値
  • 製品オプション
  • 注文
  • オーダーアイテム
  • OrderItemOption

フィクスチャ:

  • オプション: 1#サラダ
    • 値: 1#トマト、2#レタス、3#ピクルス、3#ニンジン
  • 商品名:ハンバーガー
  • 商品オプション: 1#サラダ
    • 値: 1#トマト、2#レタス、ピクルス

私の目標は次のようなものです:

class OrderItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $field = $builder->create('options', new OptionPickerType(), ['options' => $options['product']->getOptions()]);
        $field->addModelTransformation(new FixOptionIndexTransformer());
        $builder->add($field);
    }
}

class OptionPickerType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($options['options'] as $productOption) {
            $name = $productOption->getId();
            $builder->add($name, 'choice', array(
                'choice_list'   => new ObjectChoiceList($productOption->getValues(), 'label', array(), null, 'id'),
                'multiple' => true,
                'cascade_validation' => true,
                'property_path' => '['.$name.']'
            ));
        }
    }
}

$form = $factory->create(new OrderItemType(), ['product' => $product]);

if ($request->isMethod('POST')) {
    $form->bind($request);

    if ($form->isValid()) {
        $item = $form->getItem(); // A collection of ItemOption filled with the OptionValue picked out from Choice field
    }
}

この構成は、予想どおり OptionValue の配列のコレクションを返します。実際、それは私の目的には十分ではありません。私が本当に必要としているのは、選択されたすべての値といくつかの追加データを含む平坦化されたコレクションです。

class ItemOption
{
    protected $item;
    protected $productOption;
    protected $option; // $productOption->getName()
    protected $optionValue;
    protected $value; // / $optionValue->getLabel()
}

ご覧のとおり、Choice フィールドの値は実際には ItemOption 内にあります。

数日試した後、これを行う方法がわからなかったり、他のアプローチを考えたりすることさえできませんでした。

手伝って頂けますか?

4

1 に答える 1