バージョン選択

フォーラム

メニュー

オンライン状況

106 人のユーザが現在オンラインです。 (71 人のユーザが フォーラム を参照しています。)
登録ユーザ: 2
ゲスト: 104
_dauto_ 12AI24 もっと...

サイト内検索

質問 > フロント機能 > Preprocessor でカートに商品を追加するとエラー

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2020/3/4 16:59
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 992
Preprocessor でカートに商品を追加するとエラー
EC-CUBE 4.0.3

商品をカートに入れた時に条件を満たしていればプレゼント商品を自動でカートに入れる処理を ItemHolderPreprocessor を用いて独自で実装しました。

app/config/eccube/packages/purchaseflow.yaml
eccube.purchase.flow.cart.holder_preprocessors:
    class: Doctrine\Common\Collections\ArrayCollection
    arguments:
        - #
            - '@Eccube\Service\PurchaseFlow\Processor\PresentPreprocessor'


src/Eccube/Service/PurchaseFlow/Processor/PresentPreprocessor.php
public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
    ...(条件のチェック)...

    $this->cartService->addProduct($ProductClass->getId());
}

しかし、カートページを表示すると次のエラーが発生してしまいます。

InvalidArgumentException: Entity has to be managed or scheduled for removal for single computation Eccube\Entity\CartItem@000000005a631e1500000000065c3715 (uncaught exception) at /Applications/MAMP/htdocs/test/local2/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 504

エラーの発生箇所は次です。
Eccube/Service/CartService.php (line 287)
public function addProduct($ProductClass, $quantity = 1)
{
    ...

    $this->restoreCarts($allCartItems);
}

public function restoreCarts($cartItems)
{
    foreach ($this->getCarts() as $Cart) {
        foreach ($Cart->getCartItems() as $i) {
            $this->entityManager->remove($i);
            $this->entityManager->flush($i);    // ★ ここでエラー
        }
        $this->entityManager->remove($Cart);
        $this->entityManager->flush($Cart);
    }
    ...
}


このエラーを解決するにはどうすればよいでしょうか?
h_tanaka
投稿日時: 2020/3/4 20:44
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 992
Re: Preprocessor でカートに商品を追加するとエラー
原因がわかりました。
公開ステータスが「非公開」、販売種別がカート内商品と異なっているためでした。
非公開のステータスや販売種別が異なる商品をカートに追加できないのはわかりますが、エラーメッセージが非常にわかりにくいですね。。
エラーから原因が追えなかったので、気づくのに半日もかかってしまいました。。


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

h_tanaka
投稿日時: 2020/3/4 20:49
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 992
Re: Preprocessor でカートに商品を追加するとエラー
可能であれば、「通常商品」と「プレゼント商品」を同じカートに入れたいです。
プレゼント商品は0円なので決済処理等は通常商品と同じ扱いで問題ないです。

次のようにカートの識別子を分ける処理を入れてみましたが、他のValidatorでチェックされているのか上記と同じエラーが発生してしまいます。

src/Eccube/Service/Cart/SaleTypeCartAllocator.php
public function allocate(CartItem $Item)
{
   $ProductClass = $Item->getProductClass();
   if ($ProductClass && $ProductClass->getSaleType()) {

       // プレゼント商品は通常商品と同梱可能
       if ($ProductClass->getSaleType()->getId() == SaleType::SALE_TYPE_PRODUCT_PRESENT) {
           return (string) SaleType::SALE_TYPE_NORMAL;
       }

       return (string) $ProductClass->getSaleType()->getId();
   }
   throw new \InvalidArgumentException('ProductClass/SaleType not found');
}


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

h_tanaka
投稿日時: 2020/3/16 18:54
対応状況: −−−
仙人
登録日: 2016/7/22
居住地: 愛媛県
投稿: 992
Re: Preprocessor でカートに商品を追加するとエラー
そもそも ItemHolderPreprocessor 内で商品をカートに追加するにはどうすればいいのでしょうか?

標準機能において、商品ページで商品を追加するときは次のような処理を行っています。

src/Eccube/Controller/ProductController.php
// カートへ追加
$this->cartService->addProduct($addCartData['product_class_id'], $addCartData['quantity']);

// 明細の正規化
$Carts = $this->cartService->getCarts();
foreach ($Carts as $Cart) {
    $result = $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart, $this->getUser()));
    // 復旧不可のエラーが発生した場合は追加した明細を削除.
    if ($result->hasError()) {
        $this->cartService->removeProduct($addCartData['product_class_id']);
        foreach ($result->getErrors() as $error) {
            $errorMessages[] = $error->getMessage();
        }
    }
    foreach ($result->getWarning() as $warning) {
        $errorMessages[] = $warning->getMessage();
    }
}

$this->cartService->save();


この処理を参考にしているのですが、疑問があります。

1. 明細の正規化ってなんでしょうか?
  ItemHolderPreprocessor で商品をカートに追加するときも必要でしょうか?

2. 処理内で purchaseFlow を呼んでいるのですが、ItemHolderPreprocessor から purchaseFlow を呼ぶのって正しいのでしょうか?


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

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


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は60,863名です
総投稿数は95,420件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
2038
4
468
2020
5
yuh
1612
6
umebius
1588
7
red
1399
8
h_tanaka
992
9
fukap
907
10
tsuji
863
11
shutta
835
12 ramrun 789
13
tao_s
783
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

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

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