質問 > 管理機能 > 削除した商品の並び順情報が残ってしまうようです |
管理機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
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
|
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では再現すると思うのですが、皆さん目をつむって使ってられるのでしょうか。 お手数おかけした皆様、お騒がせして申し訳ありませんでした。 ありがとうございました。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |