バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

バグ報告 > 管理機能 > 【2.12.2】「商品管理>商品並び替え」が正常に行えない

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
casa
投稿日時: 2013/4/13 21:12
対応状況: −−−
長老
登録日: 2011/10/3
居住地:
投稿: 210
【2.12.2】「商品管理>商品並び替え」が正常に行えない
お世話になります。

----------
EC-CUBE: 2.12.2
MySQL: 5.5.16
----------

以下に同様の問題が報告されていますが、解決策が取り込まれていないようでしたので投稿致します。取り込めない理由・懸念などがありましたらご教授ください。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=4833&forum=11

問題点1: 商品削除時に商品カテゴリ(dtb_product_categories)が削除されていない
問題点2: 商品登録画面で、登録していたカテゴリを 「削除 ->」 ボタンで外したときに、商品カテゴリを削除したあとrankを詰めていない

問題点1の結果、商品カテゴリに不要なレコードが残ります。
問題点2の結果、商品カテゴリのrankが飛び飛びになります。

これらの状態になると題名の通り、商品並び替えが正常に行えなくなります(指定した順位に移動しない、上へ/下へを何度かクリックしないと移動しない)。

当方では以下のように修正しました。

■SC_Helper_DB

    // ▼既存処理修正
    function removeProductByCategories($category_id, $product_id) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();

        $table = 'dtb_product_categories';
        $where = 'product_id = ? AND category_id = ?';
        $arrVal = array($product_id, $category_id);

        // 削除レコードのランクを取得する。
        $rank = $objQuery->get('rank', $table, $where, $arrVal);

        // 該当レコードの削除
        $objQuery->delete($table, $where, $arrVal);

        // 削除レコードのランクより上のレコードを一つずらす。
        $where = 'category_id = ? AND rank > ?';
        $sqlup = "UPDATE $table SET rank = (rank - 1) WHERE $where";
        $objQuery->exec($sqlup, array($category_id, $rank));
    }


■LC_Page_Admin_Products

    // ▼1行追加
    function doDelete($where, $arrParam = array()) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $sqlval['del_flg']     = 1;
        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
        $objQuery->begin();
        $objQuery->update('dtb_products_class', $sqlval, "product_id IN (SELECT product_id FROM dtb_products WHERE $where)", $arrParam);
        $objQuery->delete('dtb_customer_favorite_products', "product_id IN (SELECT product_id FROM dtb_products WHERE $where)", $arrParam);
        $this->lfDeleteProductCategories($where, $arrParam);  // <-- ★追加
        $objQuery->update('dtb_products', $sqlval, $where, $arrParam);
        $objQuery->commit();
    }

    // ▼新規追加
    /**
     * 商品カテゴリから削除対象商品のレコードを削除
     * 
     * @param  string $where 削除対象の WHERE 句
     * @param  array $arrParam 削除対象の値
     * @return void
     */
    function lfDeleteProductCategories($where, $arrParam = array()) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $objDb = new SC_Helper_DB_Ex();

        // 削除対象の商品IDを取得
        $arrProductIds = $objQuery->getCol('product_id', 'dtb_products', $where, $arrParam); 

        foreach ($arrProductIds as $product_id) {
            // 登録されているカテゴリ情報を取得
            $arrCurrentCat = $objQuery->getCol('category_id', 'dtb_product_categories', 'product_id = ?', array($product_id));

            // 登録されているカテゴリからレコード削除
            foreach ($arrCurrentCat as $category_id) {
                $objDb->removeProductByCategories($category_id, $product_id);
            }
        }
    }


2.12.3の場合 doDelete の処理が若干違うので注意が必要ですが、問題ないと思います。
ご確認をお願い致します。
casa
投稿日時: 2013/4/13 21:23
対応状況: −−−
長老
登録日: 2011/10/3
居住地:
投稿: 210
Re: 【2.12.2】「商品管理>商品並び替え」が正常に行えない
開発版において、以下のチェンジセットでも doDelete が変更されておりました。その場合は次のようになるかと思います。
http://svn.ec-cube.net/open_trac/changeset/22582

■LC_Page_Admin_Products

    // ▼1行追加、2行変更
    function doDelete($where, $arrParam = array())
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $arrProductIds = $objQuery->getCol('product_id', "dtb_products", $where, $arrParam); // <-- ★$arrRetを$arrProductIdsに変更
        $product_ids = array();
        foreach ($arrProductIds as $value) {                // <-- ★$arrRetを$arrProductIdsに変更
            $product_ids[] = $value['product_id'];
        }
        $sqlval['del_flg']     = 1;
        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
        $objQuery->begin();
        $objQuery->update('dtb_products_class', $sqlval, "product_id IN (SELECT product_id FROM dtb_products WHERE $where)", $arrParam);
        $objQuery->delete('dtb_customer_favorite_products', "product_id IN (SELECT product_id FROM dtb_products WHERE $where)", $arrParam);

        $objRecomment = new SC_Helper_Recommend_Ex();
        $objRecomment->deleteByProductIDs($product_ids);

        $this->lfDeleteProductCategories($arrProductIds);   // <-- ★追加

        $objQuery->update('dtb_products', $sqlval, $where, $arrParam);
        $objQuery->commit();
    }

    // ▼新規追加
    /**
     * 商品カテゴリから削除対象商品のレコードを削除
     * 
     * @param  array $arrProductIds 商品IDの配列
     * @return void
     */
    function lfDeleteProductCategories($arrProductIds) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $objDb = new SC_Helper_DB_Ex();

        foreach ($arrProductIds as $product_id) {
            // 登録されているカテゴリ情報を取得
            $arrCurrentCat = $objQuery->getCol('category_id', 'dtb_product_categories', 'product_id = ?', array($product_id));

            // 登録されているカテゴリからレコード削除
            foreach ($arrCurrentCat as $category_id) {
                $objDb->removeProductByCategories($category_id, $product_id);
            }
        }
    }


申し訳ありませんが、こちらのバージョンでは動作確認までは行えておりませんのでご了承ください。

# 話がズレますが、上記 doDelete内の $objRecomment->deleteByProductIDs から
# $objDb->sfDeleteRankRecord が呼ばれており、ここで再度トランザクションを張っているのですが
# 問題ないでしょうか。
AMUAMU
投稿日時: 2013/4/16 3:49
対応状況: −−−
登録日: 2009/5/2
居住地: 東京都
投稿: 2712
Re: 【2.12.2】「商品管理>商品並び替え」が正常に行えない
ご報告、提案ありがとうございます!
下記でチケットを立てました。
http://svn.ec-cube.net/open_trac/ticket/2227

次バージョンには含まれるようにしたい所です。

引用:
# 話がズレますが、上記 doDelete内の $objRecomment->deleteByProductIDs から
# $objDb->sfDeleteRankRecord が呼ばれており、ここで再度トランザクションを張っているのですが
# 問題ないでしょうか。

2.12系のSC_Queryではトランザクションのネストが可能になっていますので問題無いと思われます。


----------------
EC-CUBE公式エヴァンジェリスト
EC-CUBEインテグレートパートナー (株)スピリット・オブ
移転・拡張・高速化・問題解決
各種カスタマイズ・支援依頼承ります。

[url=h

casa
投稿日時: 2013/4/16 9:17
対応状況: −−−
長老
登録日: 2011/10/3
居住地:
投稿: 210
Re: 【2.12.2】「商品管理>商品並び替え」が正常に行えない
チケット発行頂きありがとうございます。

引用:
2.12系のSC_Queryではトランザクションのネストが可能になっていますので問題無いと思われます。

こちらについてもご教授いただきありがとうございました。大変勉強になりました。


また、別スレッドを立てようか迷ったのですがこちらに記載します。

上記でも記載した開発版の doDelete処理ですが、以下のforeachループは不要ではないでしょうか。
    function doDelete($where, $arrParam = array())
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $arrRet = $objQuery->getCol('product_id', "dtb_products", $where, $arrParam);
        $product_ids = array();
        foreach ($arrRet as $value) { // ★不要では?
            $product_ids[] = $value['product_id']; // ★$value['product_id']は不定?
        }
...

getCol()を呼んでいるので、戻りは連想配列ではなくただの配列だと思われます。
AMUAMU
投稿日時: 2013/4/16 17:54
対応状況: −−−
登録日: 2009/5/2
居住地: 東京都
投稿: 2712
Re: 【2.12.2】「商品管理>商品並び替え」が正常に行えない
>上記でも記載した開発版の doDelete処理ですが、以下のforeachループは不要ではないでしょうか。

確かに不要そう・・・
あとで本体見てみます


----------------
EC-CUBE公式エヴァンジェリスト
EC-CUBEインテグレートパートナー (株)スピリット・オブ
移転・拡張・高速化・問題解決
各種カスタマイズ・支援依頼承ります。

[url=h

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


 



ログイン


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

統計情報

総メンバー数は93,681名です
総投稿数は111,075件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2318
5
umebius
2085
6
yuh
1857
7
h_tanaka
1756
8
red
1574
9
mcontact
1466
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
804
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.