バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > 管理機能 > 削除した商品の並び順情報が残ってしまうようです

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
134
投稿日時: 2009/10/20 17:28
対応状況: −−−
一人前
登録日: 2009/10/20
居住地: 京都市
投稿: 91
削除した商品の並び順情報が残ってしまうようです
商品を削除した際、商品の並び順の情報がテーブル(dtb_product_categories)から削除されないようです。
商品の並べ替え画面では、削除された商品は表示されませんが、実際に並べ替えを行おうとすると、削除済みの商品もrankの計算の対象となってしまいます。

例えば 商品A(rank=3)、商品B(rank=2)、商品C(rank=1) があり、商品Bは削除済みだとします。
このとき、並べ替えの画面では

-----
商品A
商品C
-----

と表示されます。ここで、商品Aの「下へ」をクリックすると、内部的には商品Aと商品Bのrankが入れ替わっているようですが、見た目上は順番が変わりません。その後、もう一度商品Aの「下へ」をクリックすると、今度は商品Aと商品Cのrankが入れ替わり、

-----
商品C
商品A
-----

と見た目も入れ替わります。

削除された商品は商品は並べ替えの対象とならないようにしたいのですが、どのような修正をすればよいか、どなたかご教示いただけませんでしょうか。
すでにかなりの数の商品を登録し、かなりの数の商品が削除されていますので、既存データのコンバートが必要な場合は、その方法についてもお知恵を貸して頂きたいです。

環境は下記の通りです。

----------------------------------------------------
[EC-CUBE] 2.4.1
[PHP] 5.2.10
[データベース] PostgreSQL 8.3.7
----------------------------------------------------

宜しくお願い致します。

ecbg
投稿日時: 2009/10/20 17:53
対応状況: −−−
仙人
登録日: 2009/2/25
居住地: 東京
投稿: 387
Re: 削除した商品の並び順情報が残ってしまうようです
上記の記載ですと、「削除した」という部分がどのように影響しているのか分らないですね。

もともと正規版において商品並べ替えはバグを含んでいて、複数カテゴリに追加した場合、並べ替えが効かないということもあるので、できるときとできないときを記載した方が良いと思います。
yokoshima
投稿日時: 2009/10/20 18:48
対応状況: −−−
一人前
登録日: 2009/1/6
居住地: 渋谷区恵比寿西
投稿: 113
Re: 削除した商品の並び順情報が残ってしまうようです
商品並び替えの不具合については
こちらも参考にしてみるといいかもしれません。

http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=2635&forum=9


----------------
+++++++++++++++++++++++++++++++++++++++++++++++++++
EC構築 EC製作 ECコンサルティング
株式会社マッジ

+++++++++++++++++++++++++++++++++++++++++++++++++++

134
投稿日時: 2009/10/20 19:29
対応状況: −−−
一人前
登録日: 2009/10/20
居住地: 京都市
投稿: 91
Re: 削除した商品の並び順情報が残ってしまうようです
ecbg様

お返事ありがとうございました。
拙い説明で申し訳ありません。

・削除した商品が属していたカテゴリでのみ発生します。削除した商品が商品がないカテゴリは正常です。
・商品並び替えで「上へ」「下へ」をしようとした際、削除された商品が持っていたrankと入れ替わる場合に発生します。
・商品並び替えで順位を指定する場合、削除された商品が持っていたrankをまたぐと、見た目上の位置が指定した順位どおりになりません。
・削除された商品が属していたのが、単一のカテゴリか、複数のカテゴリかにかかわらず発生します
・並び順を変更しようとしている商品が、単一のカテゴリに属しているか、複数のカテゴリに属しているかにかかわらず発生します

複数カテゴリに登録した商品の並び順に関する不具合については、
http://svn.ec-cube.net/open_trac/changeset/17853
を参考に、修正しました。


yokoshima様

お返事ありがとうございました。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=2635&forum=9
は確認しましたが、ちょっと状況が異なるようです。
カテゴリは2階層にしていますが、親カテゴリに直接商品は属させていません。
すべて子カテゴリ(末端のカテゴリ)に属させています。
また、rankが重複していたり、マイナスになっていたりというのも無いようです。


うまく説明できず申し訳ないのですが、商品の削除をした際に、dtb_product_categories に、rankの情報を持ったままのレコードがゴーストのように残ってしまうのが原因であることは分かりました。
このゴーストとrankが隣り合っている、生きている商品の「下へ」をクリックしても、このゴーストとrankの値が入れ替わり、見た目には順番が変わっていないように見えるようです。


宜しくお願い致します。

ecbg
投稿日時: 2009/10/21 9:13
対応状況: −−−
仙人
登録日: 2009/2/25
居住地: 東京
投稿: 387
Re: 削除した商品の並び順情報が残ってしまうようです
>複数カテゴリに登録した商品の並び順に関する不具合については、
>http://svn.ec-cube.net/open_trac/changeset/17853
>を参考に、修正しました。

正規版での商品並べ替え不具合はこのチェンジセットだけでは修正できませんが、コミュニティ版と同じようにビューの変更も行いましたか?

まずは商品並べ替えそのものの不具合を解消してから、本件を検証した方が良いと思いますよ。
134
投稿日時: 2009/10/22 17:12
対応状況: −−−
一人前
登録日: 2009/10/20
居住地: 京都市
投稿: 91
Re: 削除した商品の並び順情報が残ってしまうようです
ecbg様

お返事ありがとうございました。

>正規版での商品並べ替え不具合はこのチェンジセットだけでは修正できませんが、コミュニティ版と同じようにビューの変更も行いましたか

チェンジセット17938は適用しました。
チェンジセット17959およびビューの変更は、検討した結果、問題を承知の上で適用は保留しています。

保留している変更内容をもういちど確認したのですが、やはり問題はここではないように思い、対応を迫られていたこともあり、結果的に自己解決しました。
また、商品の削除時のみと報告していましたが、商品の編集時にカテゴリの所属を外す場合にも問題がありました。
(dtb_product_categories からレコードは削除されるのですが、消えた分のrankが詰まらず、やはり並び替えの動作に影響を与えています)

だいたい、下記のような変更を加えました。

◆/data/class_extends/helper_extends/SC_Helper_DB_Ex.php

removeProductByCategories をオーバーライドし、dtb_product_categories からレコードを削除した際に、rankをつめるようにしました。
これにあわせて、updateProductCategories も調整しました。

function updateProductCategories($arrCategory_id, $product_id) {
$objQuery = new SC_Query();

// 現在のカテゴリ情報を取得
$arrCurrentCat = $objQuery->select("product_id, category_id, rank",
"dtb_product_categories",
"product_id = ?",
array($product_id));

// 登録するカテゴリ情報と比較
foreach ($arrCurrentCat as $val) {

// 登録しないカテゴリを削除
if (!in_array($val["category_id"], $arrCategory_id)) {
$this->removeProductByCategories($val["category_id"], $product_id, $val['rank']);
}
}

// カテゴリを登録
foreach ($arrCategory_id as $category_id) {
$this->addProductBeforCategories($category_id, $product_id);
}
}

function removeProductByCategories($category_id, $product_id, $rank = NULL) {
$objQuery = new SC_Query();
$sqlval = array("category_id" => $category_id,
"product_id" => $product_id);

// rankが不明の場合は取得する
if (is_null($rank)) {
list($rank) = $objQuery->getrow("dtb_product_categories", "rank", "category_id = ? AND product_id = ?", $sqlval);
}

$objQuery->delete("dtb_product_categories",
"category_id = ? AND product_id = ?", $sqlval);

// 削除した商品よりもrankが上のものをずらす
$sqlup = "UPDATE dtb_product_categories SET rank = (rank - 1) WHERE category_id = ? AND rank > ?";
$objQuery->exec($sqlup, array($category_id, $rank));

}


◆/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_Ex.php

process をオーバーライドし、商品の削除時に、SC_Helper_DB_Ex::removeProductByCategories を呼ぶようにしました。
(LC_Page_Admin_Products.php では139行目あたりに下記を追記)

$categories = $objQuery->select('category_id, rank', 'dtb_product_categories', 'product_id = ?', array($_POST['product_id']));
foreach ($categories as $category) {
$objDb->removeProductByCategories($category['category_id'], $_POST['product_id'], $category['rank']);
}


既存データのコンバートは、別途プログラムを作成して行いました。

若干不安はありますが、これで今のところ問題はなさそうです。
少なくとも2.4.0、2.4.1では再現すると思うのですが、皆さん目をつむって使ってられるのでしょうか。

お手数おかけした皆様、お騒がせして申し訳ありませんでした。
ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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.