バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

プラグイン > バグ報告・利用に関する質問 > 関連商品プラグインのエラー

バグ報告・利用に関する質問

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
naham
投稿日時: 2018/7/17 17:19
対応状況: −−−
半人前
登録日: 2017/1/11
居住地:
投稿: 11
Re: 関連商品プラグインのエラー
red様

ありがとうございます。
ひとまずの解決策として、影響がないか確認後行ってみたいと思います。
naham
投稿日時: 2018/7/17 17:18
対応状況: 開発中
半人前
登録日: 2017/1/11
居住地:
投稿: 11
Re: 関連商品プラグインのエラー
468様

原因箇所の救命と解決用のコード、誠にありがとうございます。
早速テストを行ってみます。
上手く言ったらまたご報告させていただきます。
red
投稿日時: 2018/7/11 21:00
対応状況: −−−
登録日: 2010/2/15
居住地: 東京都
投稿: 1567
Re: 関連商品プラグインのエラー
MySQLであればUNSIGNEDにしておくだけでもだいぶ違う気がします


----------------
EC-CUBEのカスタマイズ、トラブル解決承ります
お気軽にお問い合わせ下さい
https://www.ec-cube.net/integrate/partner/partner.php?partner_id=690

468
投稿日時: 2018/7/11 1:38
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: 関連商品プラグインのエラー
プラグイン内の/Event/Event.php 164行目の以下の記述が原因で
一旦すべて、関連商品データを削除して新規登録し直しているようです。
$app['eccube.plugin.repository.related_product']->removeChildProduct($Product);


function onRenderAdminProductComplete()の中を
以下のソースのように、登録済の関連商品と画面から送信された関連商品を比較して、追加・更新・削除を行うようにすれば、
無駄にIDを消費する事は無くなると思います。

    public function onRenderAdminProductComplete(EventArgs  $event)
    {
        log_info('RelatedProduct trigger onRenderAdminProductComplete start');
        $app = $this->app;
        $Product = $event->getArgument('Product');
        $form = $event->getArgument('form');
        //$app['eccube.plugin.repository.related_product']->removeChildProduct($Product);
        
        
        //$FromRelatedProducts = $app['eccube.plugin.repository.related_product']->getRelatedProduct($Product, Constant::DISABLED);
        $FromRelatedProducts = $app['eccube.plugin.repository.related_product']->findBy(array('Product' => $Product));
        //更新対象の関連商品を一時的に格納する配列
        $updateRelatedProducts = array();
        //削除対象の関連商品を一時的に格納する配列
        $deleteRelatedProducts = array();
                
        log_info('remove all now related product data of ', array('Product id' => $Product->getId()));
        
        $RelatedProducts = $form->get('related_collection')->getData();
        
        if (count($FromRelatedProducts) == 0) {
            //関連商品が未登録の場合
            foreach ($RelatedProducts as $RelatedProduct) {
            
                /* @var $RelatedProduct \Plugin\RelatedProduct\Entity\RelatedProduct */
                if ($RelatedProduct->getChildProduct() instanceof Product) {

                    $RelatedProduct->setProduct($Product);
                    $app['orm.em']->persist($RelatedProduct);
                    $app['orm.em']->flush($RelatedProduct);
                    log_info('save new related product data to DB ', array('Related Product id' => $RelatedProduct->getId()));
                    
                }
            
            }
            
        } else {
            //既に登録されている関連商品と画面から渡された関連商品を比較
            foreach ($FromRelatedProducts as $FromRelatedProduct) {
            
                $deleteFlg = true;
                $FromChildProduct = $FromRelatedProduct->getChildProduct();
                if ($FromChildProduct) {
                    foreach ($RelatedProducts as $RelatedProduct) {
                    
                        /* @var $RelatedProduct \Plugin\RelatedProduct\Entity\RelatedProduct */
                        if ($RelatedProduct->getChildProduct() instanceof Product) {
                            if ($RelatedProduct->getChildProduct()->getId() == $FromChildProduct->getId()) {
                                //既に登録済の関連商品は更新する
                                $deleteFlg = false;
                                $updateRelatedProducts[] = $RelatedProduct;
                                
                                $FromRelatedProduct->setContent($RelatedProduct->getContent());
                                $app['orm.em']->persist($FromRelatedProduct);
                                $app['orm.em']->flush($FromRelatedProduct);
                                
                                break;
                            }
                        }
                    }
                }
            
                if ($deleteFlg) {
                    $deleteRelatedProducts[] = $FromRelatedProduct;
                }
            
            }
            
            //画面から渡された関連商品の内、新規追加分を登録
            foreach ($RelatedProducts as $RelatedProduct) {
                if ($RelatedProduct->getChildProduct() instanceof Product) {
                    if (!in_array($RelatedProduct, $updateRelatedProducts)) {
                        $RelatedProduct->setProduct($Product);
                        $app['orm.em']->persist($RelatedProduct);
                        $app['orm.em']->flush($RelatedProduct);
                        log_info('save new related product data to DB ', array('Related Product id' => $RelatedProduct->getId()));
                    }
                }
            }
            
            //既に登録済で画面から渡された関連商品に存在しなかった関連商品を削除
            foreach ($deleteRelatedProducts as $RelatedProduct) {
                $app['orm.em']->remove($RelatedProduct);
                $app['orm.em']->flush($RelatedProduct);
            }
        }
        
        log_info('RelatedProduct trigger onRenderAdminProductComplete finish');
    }

※軽く動作確認していますが、パパッと書いたコードなので、きちんとした検証は必要かと思います。


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

naham
投稿日時: 2018/7/9 13:15
対応状況: −−−
半人前
登録日: 2017/1/11
居住地:
投稿: 11
関連商品プラグインのエラー
EC-CUBE3の「関連商品プラグイン」ですが、
商品情報を更新(在庫数を変更)以下のエラーが発生しました。
画面では「システムエラーです」と表示され、商品情報が更新できません。

[2018-07-09 11:28:29] eccube.INFO: remove all now related product data of {"Product id":364} []
[2018-07-09 11:28:29] eccube.INFO: save new related product data to DB {"Related Product id":32767} []
[2018-07-09 11:28:29] eccube.CRITICAL: Doctrine\DBAL\Exception\UniqueConstraintViolationException: An exception occurred while executing 'INSERT INTO plg_related_product (content, product_id, child_product_id) VALUES (?, ?, ?)' with params [null, 364, 366]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' (uncaught exception) at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php line 66 {"exception":"[object] (Doctrine\\DBAL\\Exception\\UniqueConstraintViolationException(code: 0): An exception occurred while executing 'INSERT INTO plg_related_product (content, product_id, child_product_id) VALUES (?, ?, ?)' with params [null, 364, 366]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:66, Doctrine\\DBAL\\Driver\\PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:93, PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '32767' for key 'PRIMARY' at /home/サーバID/ドメイン/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:91)"} []


推測なのですが、「関連商品プラグイン」が、商品情報を更新するたびに新しいidを追加しており、
それがMySQLの上限である32767を超えてしまった…という形でしょうか。

一応プラグインを停止すれば通常通り使えますし、
「関連商品の情報」をリセットすれば問題なく使えるのでしょうが、何か根本的な解決策はないでしょうか。
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
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.