バージョン選択

フォーラム

メニュー

オンライン状況

70 人のユーザが現在オンラインです。 (60 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 70
もっと...

サイト内検索

質問 > フロント機能 > 注文商品を選択肢にしたい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2019/4/9 9:25
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1638
注文商品を選択肢にしたい
EC-CUBE 4.0.0

注文した商品情報に紐づく商品セットを作成したいです。

 OrderItem
  ┗ Set

1つの商品セットで、1つの注文済みの商品を選択させたいのですが、Formの実装方法がわかりません。

試しに下記のように実装してみましたが、次のエラーが発生してしまいます。
Could not load type "Eccube\Entity\Master\OrderItemType": class does not implement "Symfony\Component\Form\FormTypeInterface".

app/Customize/Form/Type/Front/SetType.php
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $Set = $options['data'];
        $Order = $this->orderRepository->findOneBy(['Customer' => $Set->getCustomer()]);
        $OrderItems = $Order->getOrderItems();

        $builder
            ->add('name', TextType::class, [
                'required' => true,
                'constraints' => [
                    new Assert\NotBlank(),
                ],
            ])
            ->add('order_item', OrderItemType::class, [
                'required' => true,
                'data' => $OrderItems,
                'constraints' => [
                    new Assert\NotBlank(),
                ],
            ])
        ;
    }
468
投稿日時: 2019/4/9 10:39
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 注文商品を選択肢にしたい
エンティティを選択する形にしたいという事でしょうか?
例えば、ShoppingTypeの支払方法は以下のような記述でPaymentを指定しているようです。

->add('payment', EntityType::class, [
    'class' => 'Eccube\Entity\Payment',
    'choice_label' => 'method',
    'choices' => $payments,
    'data' => $payment,
    'expanded' => true,
    'constraints' => [
        new Assert\NotBlank(),
    ],
])


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

h_tanaka
投稿日時: 2019/4/9 12:17
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1638
Re: 注文商品を選択肢にしたい
468 さん

ありがとうございます。

いただいた情報をもとに試行錯誤して、なんとかうまく動作させることができました。
OrderItem の Entity をそのまま取得・保存するのが難しいと思ったため、対象を ProductClass に変更し、'mapped' => false で独自Formを作成して、Controller でリクエストから取得した情報を保存するようにしました。

app/Customize/Form/Type/Front/SetType.php
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $Set = $options['data'];
        $Orders = $this->orderRepository->findBy(['Customer' => $Set->getCustomer()]);

        $ProductClasses = array();
        foreach ($Orders as $Order) {
            $OrderItems = $Order->getOrderItems();
            foreach ($OrderItems as $OrderItem) {
                $ProductClass = $OrderItem->getProductClass();
                if ($ProductClass) {
                    $ProductClasses[$ProductClass->formattedProductName()] = $ProductClass->getId();
                }
            }
        }

        $ProductClass1 = $Set->getProductClass1();
        $product_class_id1 = null;
        if ($ProductClass1) {
            $product_class_id1 = $ProductClass1->getId();
        }

        $builder
            ->add('name', TextType::class, [
                'required' => true,
                'constraints' => [
                    new Assert\NotBlank(),
                ],
            ])
            ->add('product_class1', ChoiceType::class, [
                'required' => true,
                'choices' => ['common.select' => '__unselected'] + $ProductClasses,
                'data' => $product_class_id1,
                'multiple' => false,
                'expanded' => false,
                'mapped' => false,
                'constraints' => [
                    new Assert\NotBlank(),
                ],
            ])
        ;
    }


app/Customize/Controller/Mypage/SetController.php
        if ($form->isSubmitted() && $form->isValid()) {
            log_info('セット登録開始', [$id]);

            $request_set = $request->request->get('set');
            $product_class_id = $request_set['product_class1'];
            if (!empty($product_class_id)) {
                $ProductClass = $this->productClassRepository->find($product_class_id);
                $Set->setProductClass1($ProductClass);
            }

            $this->entityManager->persist($Set);
            $this->entityManager->flush();

            log_info('セット登録完了', [$id]);

            return $this->redirect($this->generateUrl('mypage_set'));
        }


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,712名です
総投稿数は109,949件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1638
8
red
1570
9
mcontact
1285
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.