バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

管理機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
AMUAMU
投稿日時: 2013/4/16 17:54
対応状況: −−−
登録日: 2009/5/2
居住地: 東京都
投稿: 2712
Re: 【2.12.2】「商品管理>商品並び替え」が正常に行えない
>上記でも記載した開発版の doDelete処理ですが、以下のforeachループは不要ではないでしょうか。

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


----------------
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 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/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 が呼ばれており、ここで再度トランザクションを張っているのですが
# 問題ないでしょうか。
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 の処理が若干違うので注意が必要ですが、問題ないと思います。
ご確認をお願い致します。
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

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

統計情報

総メンバー数は67,445名です
総投稿数は98,813件です

投稿数ランキング

1
seasoft
7333
2
AMUAMU
2712
3
468
2693
4
nanasess
2116
5
umebius
1789
6
yuh
1612
7
red
1427
8
h_tanaka
1051
9
fukap
907
10
tsuji
863
11
shutta
835
12
tao_s
792
13 ramrun 789
14 karin 657
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.