お世話になります。
----------
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 の処理が若干違うので注意が必要ですが、問題ないと思います。
ご確認をお願い致します。