From 9bdf20819b897c07696d1377b37c4cee66bd2188 Mon Sep 17 00:00:00 2001 From: Seasoft Date: Tue, 8 Dec 2020 16:29:57 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=E3=82=AB=E3=83=86=E3=82=B4=E3=83=AA?= =?UTF-8?q?=E3=81=AB=E7=B4=90=E4=BB=98=E3=81=84=E3=81=9F=E5=95=86=E5=93=81?= =?UTF-8?q?=E3=81=8C0=E3=81=A8=E3=81=AA=E3=81=A3=E3=81=9F=E5=A0=B4?= =?UTF-8?q?=E5=90=88=E3=81=AB=20dtb=5Fcategory=5Ftotal=5Fcount=20=E3=81=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=81=95=E3=82=8C=E3=81=AA=E3=81=84=20#125?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 商品0件の場合、dtb_category_count dtb_category_total_count に残さない。 変数名を整理。 配列を短縮構文で記述。 --- data/class/helper/SC_Helper_DB.php | 140 ++++++++++++----------------- 1 file changed, 59 insertions(+), 81 deletions(-) diff --git a/data/class/helper/SC_Helper_DB.php b/data/class/helper/SC_Helper_DB.php index f11a3ef80e..8ced595517 100644 --- a/data/class/helper/SC_Helper_DB.php +++ b/data/class/helper/SC_Helper_DB.php @@ -723,35 +723,37 @@ public function sfCountCategory($objQuery = NULL, $is_force_all_count = false, $ } //共通のfrom/where文の構築 - $sql_where = SC_Product_Ex::getProductDispConditions('alldtl'); + $where_alldtl = SC_Product_Ex::getProductDispConditions('alldtl', $for_reseller); // 在庫無し商品の非表示 if ($is_nostock_hidden) { - $where_products_class = '(stock >= 1 OR stock_unlimited = 1)'; - $from = $objProduct->alldtlSQL($where_products_class); + $from_alldtl = $objProduct->alldtlSQL('(stock >= 1 OR stock_unlimited = 1)'); } else { - $from = 'dtb_products as alldtl'; + $from_alldtl = 'dtb_products as alldtl'; } //dtb_category_countの構成 // 各カテゴリに所属する商品の数を集計。集計対象には子カテゴリを含まない。 - //まずテーブル内容の元を取得 - if (!$is_force_all_count) { - $arrCategoryCountOld = $objQuery->select('category_id,product_count', 'dtb_category_count'); + if ($is_force_all_count) { + $objQuery->delete('dtb_category_count'); + $arrCategoryCountOld = []; } else { - $arrCategoryCountOld = array(); + // テーブル内容の元を取得 + $arrCategoryCountOld = $objQuery->select('category_id, product_count', 'dtb_category_count'); } //各カテゴリ内の商品数を数えて取得 $sql = <<< __EOS__ - SELECT T1.category_id, count(T2.category_id) as product_count + SELECT T1.category_id, count(*) as product_count FROM dtb_category AS T1 - LEFT JOIN dtb_product_categories AS T2 + INNER JOIN dtb_product_categories AS T2 ON T1.category_id = T2.category_id - LEFT JOIN $from + INNER JOIN $from_alldtl ON T2.product_id = alldtl.product_id - WHERE $sql_where - GROUP BY T1.category_id, T2.category_id + AND $where_alldtl + WHERE T1.del_flg = 0 + GROUP BY T1.category_id + HAVING count(*) <> 0 __EOS__; $arrCategoryCountNew = $objQuery->getAll($sql); @@ -760,12 +762,12 @@ public function sfCountCategory($objQuery = NULL, $is_force_all_count = false, $ //各カテゴリ毎のデータ値において以前との差を見る //古いデータの構造入れ替え - $arrOld = array(); + $arrOld = []; foreach ($arrCategoryCountOld as $item) { $arrOld[$item['category_id']] = $item['product_count']; } //新しいデータの構造入れ替え - $arrNew = array(); + $arrNew = []; foreach ($arrCategoryCountNew as $item) { $arrNew[$item['category_id']] = $item['product_count']; } @@ -773,105 +775,81 @@ public function sfCountCategory($objQuery = NULL, $is_force_all_count = false, $ unset($arrCategoryCountOld); unset($arrCategoryCountNew); - $arrDiffCategory_id = array(); - //新しいカテゴリ一覧から見て商品数が異なるデータが無いか確認 - foreach ($arrNew as $cid => $count) { - if ($arrOld[$cid] != $count) { - $arrDiffCategory_id[] = $cid; - } - } + $arrNotExistsProductCategoryId = []; //削除カテゴリを想定して、古いカテゴリ一覧から見て商品数が異なるデータが無いか確認。 - foreach ($arrOld as $cid => $count) { - if ($arrNew[$cid] != $count && $count > 0) { - $arrDiffCategory_id[] = $cid; + foreach ($arrOld as $category_id => $count) { + // 商品が存在しない + if (!isset($arrNew[$category_id])) { + $arrNotExistsProductCategoryId[] = $category_id; } - } - - //対象IDが無ければ終了 - if (count($arrDiffCategory_id) == 0) { - if ($is_out_trans) { - $objQuery->commit(); + // 変更なし + elseif ($arrNew[$category_id] == $count) { + unset($arrNew[$category_id]); } + } - return; + foreach ($arrNotExistsProductCategoryId as $category_id) { + $objQuery->delete('dtb_category_count', 'category_id = ?', array($category_id)); } - //差分対象カテゴリIDの重複を除去 - $arrDiffCategory_id = array_unique($arrDiffCategory_id); + // 差分があったIDとその親カテゴリID + $arrTgtCategoryId = $arrNotExistsProductCategoryId; - //dtb_category_countの更新 差分のあったカテゴリだけ更新する。 - foreach ($arrDiffCategory_id as $cid) { - $sqlval = array(); + // dtb_category_countの更新 差分のあったカテゴリだけ更新する。 + foreach ($arrNew as $category_id => $count) { + $sqlval = []; $sqlval['create_date'] = 'CURRENT_TIMESTAMP'; - $sqlval['product_count'] = (string) $arrNew[$cid]; - if ($sqlval['product_count'] =='') { - $sqlval['product_count'] = (string) '0'; - } - if (isset($arrOld[$cid])) { - $objQuery->update('dtb_category_count', $sqlval, 'category_id = ?', array($cid)); + $sqlval['product_count'] = $count; + if (isset($arrOld[$category_id])) { + $objQuery->update('dtb_category_count', $sqlval, 'category_id = ?', array($category_id)); } else { - if ($is_force_all_count) { - $ret = $objQuery->update('dtb_category_count', $sqlval, 'category_id = ?', array($cid)); - if ($ret > 0) { - continue; - } - } - $sqlval['category_id'] = $cid; + $sqlval['category_id'] = $category_id; $objQuery->insert('dtb_category_count', $sqlval); } + $arrParentID = $this->sfGetParents('dtb_category', 'parent_category_id', 'category_id', $category_id); + $arrTgtCategoryId = array_merge($arrTgtCategoryId, $arrParentID); } + $arrTgtCategoryId = array_unique($arrTgtCategoryId); unset($arrOld); unset($arrNew); - //差分があったIDとその親カテゴリIDのリストを取得する - $arrTgtCategory_id = array(); - foreach ($arrDiffCategory_id as $parent_category_id) { - $arrTgtCategory_id[] = $parent_category_id; - $arrParentID = $this->sfGetParentsArray('dtb_category', 'parent_category_id', 'category_id', $parent_category_id); - $arrTgtCategory_id = array_unique(array_merge($arrTgtCategory_id, $arrParentID)); - } - - unset($arrDiffCategory_id); - //dtb_category_total_count 集計処理開始 //更新対象カテゴリIDだけ集計しなおす。 - $arrUpdateData = array(); - $where_products_class = ''; - if ($is_nostock_hidden) { - $where_products_class .= '(stock >= 1 OR stock_unlimited = 1)'; - } - $from = $objProduct->alldtlSQL($where_products_class); - foreach ($arrTgtCategory_id as $category_id) { - $arrWhereVal = array(); + $arrUpdateData = []; + foreach ($arrTgtCategoryId as $category_id) { + $arrWhereVal = []; list($tmp_where, $arrTmpVal) = $this->sfGetCatWhere($category_id); if ($tmp_where != '') { - $sql_where_product_ids = 'product_id IN (SELECT product_id FROM dtb_product_categories WHERE ' . $tmp_where . ')'; + $where_product_ids = 'product_id IN (SELECT product_id FROM dtb_product_categories WHERE ' . $tmp_where . ')'; $arrWhereVal = $arrTmpVal; } else { - $sql_where_product_ids = '0<>0'; // 一致させない + $where_product_ids = '0<>0'; // 一致させない } - $where = "($sql_where) AND ($sql_where_product_ids)"; + $where = "($where_alldtl) AND ($where_product_ids)"; - $arrUpdateData[$category_id] = $objQuery->count($from, $where, $arrWhereVal); + $arrUpdateData[$category_id] = $objQuery->count($from_alldtl, $where, $arrWhereVal); } - unset($arrTgtCategory_id); + unset($arrTgtCategoryId); // 更新対象だけを更新。 - foreach ($arrUpdateData as $cid => $count) { - $sqlval = array(); - $sqlval['create_date'] = 'CURRENT_TIMESTAMP'; - $sqlval['product_count'] = $count; - if ($sqlval['product_count'] =='') { - $sqlval['product_count'] = (string) '0'; + foreach ($arrUpdateData as $category_id => $count) { + if ($count == 0) { + $objQuery->delete('dtb_category_total_count', 'category_id = ?', array($category_id)); + continue 1; } - $ret = $objQuery->update('dtb_category_total_count', $sqlval, 'category_id = ?', array($cid)); + $sqlval = [ + 'product_count' => $count, + 'create_date' => 'CURRENT_TIMESTAMP', + ]; + $ret = $objQuery->update('dtb_category_total_count', $sqlval, 'category_id = ?', array($category_id)); if (!$ret) { - $sqlval['category_id'] = $cid; + $sqlval['category_id'] = $category_id; $objQuery->insert('dtb_category_total_count', $sqlval); } } + // トランザクション終了処理 if ($is_out_trans) { $objQuery->commit(); From 795ce7c051eb47dde5fade6e5eef407542656488 Mon Sep 17 00:00:00 2001 From: Seasoft Date: Mon, 1 Jan 2024 00:15:05 +0900 Subject: [PATCH 2/6] =?UTF-8?q?SC=5FHelper=5FHandleError=20=E3=81=A7?= =?UTF-8?q?=E5=AE=9A=E7=BE=A9=E5=89=8D=E3=81=AE=20ERROR=5FLOG=5FREALFILE?= =?UTF-8?q?=20=E3=81=8C=E4=BD=BF=E3=82=8F=E3=82=8C=E3=82=8B=E3=81=93?= =?UTF-8?q?=E3=81=A8=E3=81=8C=E3=81=82=E3=82=8B=20#808?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/class/helper/SC_Helper_HandleError.php | 45 +++++++++++++++------ tests/require.php | 3 ++ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/data/class/helper/SC_Helper_HandleError.php b/data/class/helper/SC_Helper_HandleError.php index 251376b42b..a1b1d81843 100644 --- a/data/class/helper/SC_Helper_HandleError.php +++ b/data/class/helper/SC_Helper_HandleError.php @@ -34,6 +34,9 @@ class SC_Helper_HandleError /** エラー処理中か */ static $under_error_handling = false; + /** display_errors の初期値 */ + static $default_display_errors; + /** * 処理の読み込みを行う * @@ -51,21 +54,16 @@ public static function load() // 開発時は -1 (全て) を推奨 error_reporting(E_ALL & ~E_NOTICE & ~E_USER_NOTICE); + static::$default_display_errors = ini_get('display_errors'); + if (!(defined('SAFE') && SAFE === true) && !(defined('INSTALL_FUNCTION') && INSTALL_FUNCTION === true)) { // E_USER_ERROR または警告を捕捉した場合のエラーハンドラ set_error_handler(array(__CLASS__, 'handle_warning'), E_USER_ERROR | E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING); - // 実質的に PHP 5.2 以降かで処理が分かれる - if (function_exists('error_get_last')) { - // E_USER_ERROR 以外のエラーを捕捉した場合の処理用 - register_shutdown_function(array(__CLASS__, 'handle_error')); - // 以降の処理では画面へのエラー表示は行なわない - ini_set('display_errors', 0); - } else { - // エラー捕捉用の出力バッファリング - ob_start(array(__CLASS__, '_fatal_error_handler')); - ini_set('display_errors', 1); - } + // E_USER_ERROR 以外のエラーを捕捉した場合の処理用 + register_shutdown_function(array(__CLASS__, 'handle_error')); + // 以降の処理では画面へのエラー表示は行なわない + ini_set('display_errors', 0); } } @@ -92,10 +90,22 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) return; } + // パラメーターが読み込まれるまでは、PHP 標準のエラー処理とする。 + // - phpunit の実行中に Warning が出力されることでテストが失敗するテストケースがあっため、除外している。 + if (!defined('ERROR_LOG_REALFILE') && !(defined('TEST_FUNCTION') && TEST_FUNCTION === true)) { + return false; + } + $error_type_name = GC_Utils_Ex::getErrorTypeName($errno); switch ($errno) { case E_USER_ERROR: + // パラメーターが読み込まれるまでは、エラー例外をスローする。(上の分岐があるため phpunit の実行中に限定される。) + if (!defined('ERROR_LOG_REALFILE')) { + ini_set('display_errors', static::$default_display_errors); + throw new ErrorException($errstr, 0, $errno, $errfile, $errline); + } + $message = "Fatal error($error_type_name): $errstr on [$errfile($errline)]"; GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE, true); @@ -107,8 +117,10 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) case E_USER_WARNING: case E_CORE_WARNING: case E_COMPILE_WARNING: - $message = "Warning($error_type_name): $errstr on [$errfile($errline)]"; - GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE); + if (defined('ERROR_LOG_REALFILE')) { + $message = "Warning($error_type_name): $errstr on [$errfile($errline)]"; + GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE); + } return true; @@ -129,6 +141,7 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) * @param string $buffer 出力バッファリングの内容 * @return string|void エラーが捕捉された場合は, エラーページへリダイレクトする; * エラーが捕捉されない場合は, 出力バッファリングの内容を返す + * @deprecated 2.18 EC-CUBE 本体では使用していない。 */ static function &_fatal_error_handler(&$buffer) { @@ -179,6 +192,12 @@ public static function handle_error() return; } + // パラメーターが読み込まれるまでは、エラー例外をスローする。 + if (!defined('ERROR_LOG_REALFILE')) { + ini_set('display_errors', static::$default_display_errors); + throw new ErrorException($arrError['message'], 0, $arrError['type'], $arrError['file'], $arrError['line']); + } + $error_type_name = GC_Utils_Ex::getErrorTypeName($arrError['type']); $errstr = "Fatal error($error_type_name): {$arrError['message']} on [{$arrError['file']}({$arrError['line']})]"; diff --git a/tests/require.php b/tests/require.php index 73154f19eb..b353025ed6 100644 --- a/tests/require.php +++ b/tests/require.php @@ -1,6 +1,9 @@ Date: Thu, 4 Jan 2024 18:05:28 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Revert=20"SC=5FHelper=5FHandleError=20?= =?UTF-8?q?=E3=81=A7=E5=AE=9A=E7=BE=A9=E5=89=8D=E3=81=AE=20ERROR=5FLOG=5FR?= =?UTF-8?q?EALFILE=20=E3=81=8C=E4=BD=BF=E3=82=8F=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E3=81=93=E3=81=A8=E3=81=8C=E3=81=82=E3=82=8B=20#808"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 795ce7c051eb47dde5fade6e5eef407542656488. ローカルで phpunit を通すため cherry-pick していたものを誤って含めてしまった。 --- data/class/helper/SC_Helper_HandleError.php | 45 ++++++--------------- tests/require.php | 3 -- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/data/class/helper/SC_Helper_HandleError.php b/data/class/helper/SC_Helper_HandleError.php index a1b1d81843..251376b42b 100644 --- a/data/class/helper/SC_Helper_HandleError.php +++ b/data/class/helper/SC_Helper_HandleError.php @@ -34,9 +34,6 @@ class SC_Helper_HandleError /** エラー処理中か */ static $under_error_handling = false; - /** display_errors の初期値 */ - static $default_display_errors; - /** * 処理の読み込みを行う * @@ -54,16 +51,21 @@ public static function load() // 開発時は -1 (全て) を推奨 error_reporting(E_ALL & ~E_NOTICE & ~E_USER_NOTICE); - static::$default_display_errors = ini_get('display_errors'); - if (!(defined('SAFE') && SAFE === true) && !(defined('INSTALL_FUNCTION') && INSTALL_FUNCTION === true)) { // E_USER_ERROR または警告を捕捉した場合のエラーハンドラ set_error_handler(array(__CLASS__, 'handle_warning'), E_USER_ERROR | E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING); - // E_USER_ERROR 以外のエラーを捕捉した場合の処理用 - register_shutdown_function(array(__CLASS__, 'handle_error')); - // 以降の処理では画面へのエラー表示は行なわない - ini_set('display_errors', 0); + // 実質的に PHP 5.2 以降かで処理が分かれる + if (function_exists('error_get_last')) { + // E_USER_ERROR 以外のエラーを捕捉した場合の処理用 + register_shutdown_function(array(__CLASS__, 'handle_error')); + // 以降の処理では画面へのエラー表示は行なわない + ini_set('display_errors', 0); + } else { + // エラー捕捉用の出力バッファリング + ob_start(array(__CLASS__, '_fatal_error_handler')); + ini_set('display_errors', 1); + } } } @@ -90,22 +92,10 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) return; } - // パラメーターが読み込まれるまでは、PHP 標準のエラー処理とする。 - // - phpunit の実行中に Warning が出力されることでテストが失敗するテストケースがあっため、除外している。 - if (!defined('ERROR_LOG_REALFILE') && !(defined('TEST_FUNCTION') && TEST_FUNCTION === true)) { - return false; - } - $error_type_name = GC_Utils_Ex::getErrorTypeName($errno); switch ($errno) { case E_USER_ERROR: - // パラメーターが読み込まれるまでは、エラー例外をスローする。(上の分岐があるため phpunit の実行中に限定される。) - if (!defined('ERROR_LOG_REALFILE')) { - ini_set('display_errors', static::$default_display_errors); - throw new ErrorException($errstr, 0, $errno, $errfile, $errline); - } - $message = "Fatal error($error_type_name): $errstr on [$errfile($errline)]"; GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE, true); @@ -117,10 +107,8 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) case E_USER_WARNING: case E_CORE_WARNING: case E_COMPILE_WARNING: - if (defined('ERROR_LOG_REALFILE')) { - $message = "Warning($error_type_name): $errstr on [$errfile($errline)]"; - GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE); - } + $message = "Warning($error_type_name): $errstr on [$errfile($errline)]"; + GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE); return true; @@ -141,7 +129,6 @@ public static function handle_warning($errno, $errstr, $errfile, $errline) * @param string $buffer 出力バッファリングの内容 * @return string|void エラーが捕捉された場合は, エラーページへリダイレクトする; * エラーが捕捉されない場合は, 出力バッファリングの内容を返す - * @deprecated 2.18 EC-CUBE 本体では使用していない。 */ static function &_fatal_error_handler(&$buffer) { @@ -192,12 +179,6 @@ public static function handle_error() return; } - // パラメーターが読み込まれるまでは、エラー例外をスローする。 - if (!defined('ERROR_LOG_REALFILE')) { - ini_set('display_errors', static::$default_display_errors); - throw new ErrorException($arrError['message'], 0, $arrError['type'], $arrError['file'], $arrError['line']); - } - $error_type_name = GC_Utils_Ex::getErrorTypeName($arrError['type']); $errstr = "Fatal error($error_type_name): {$arrError['message']} on [{$arrError['file']}({$arrError['line']})]"; diff --git a/tests/require.php b/tests/require.php index b353025ed6..73154f19eb 100644 --- a/tests/require.php +++ b/tests/require.php @@ -1,9 +1,6 @@ Date: Fri, 16 Feb 2024 12:28:58 +0900 Subject: [PATCH 4/6] =?UTF-8?q?fix=20#125=20=E5=AD=98=E5=9C=A8=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E5=BC=95=E6=95=B0=E3=81=AB=E6=9C=AA=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9=E5=A4=89=E6=95=B0=E3=82=92=E6=B8=A1=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 別件と同時実装し、9bdf20819b897c07696d1377b37c4cee66bd2188 で本件を分離する際に混入したもの。実質的な動作に変化はない。 --- data/class/helper/SC_Helper_DB.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/class/helper/SC_Helper_DB.php b/data/class/helper/SC_Helper_DB.php index 60cf266ea9..50ab6152e7 100644 --- a/data/class/helper/SC_Helper_DB.php +++ b/data/class/helper/SC_Helper_DB.php @@ -772,7 +772,7 @@ public function sfCountCategory($objQuery = NULL, $is_force_all_count = false, $ } //共通のfrom/where文の構築 - $where_alldtl = SC_Product_Ex::getProductDispConditions('alldtl', $for_reseller); + $where_alldtl = SC_Product_Ex::getProductDispConditions('alldtl'); // 在庫無し商品の非表示 if ($is_nostock_hidden) { $from_alldtl = $objProduct->alldtlSQL('(stock >= 1 OR stock_unlimited = 1)'); From 5dacb7e66316aefc37479c5af32761b0f21c37a5 Mon Sep 17 00:00:00 2001 From: Seasoft Date: Sat, 17 Feb 2024 01:06:37 +0900 Subject: [PATCH 5/6] =?UTF-8?q?fix=20#125=20=E8=A6=AA=E3=82=AB=E3=83=86?= =?UTF-8?q?=E3=82=B4=E3=83=AAID=E3=81=AE=E5=87=A6=E7=90=86=E6=BC=8F?= =?UTF-8?q?=E3=82=8C=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82=E9=9D=9E=E6=8E=A8?= =?UTF-8?q?=E5=A5=A8=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=81=AE=E5=88=A9?= =?UTF-8?q?=E7=94=A8=E3=82=92=E5=9B=9E=E9=81=BF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/class/helper/SC_Helper_DB.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/data/class/helper/SC_Helper_DB.php b/data/class/helper/SC_Helper_DB.php index 50ab6152e7..7d0f916325 100644 --- a/data/class/helper/SC_Helper_DB.php +++ b/data/class/helper/SC_Helper_DB.php @@ -837,12 +837,15 @@ public function sfCountCategory($objQuery = NULL, $is_force_all_count = false, $ } } + // 差分があったIDとその親カテゴリID + $arrTgtCategoryId = $arrNotExistsProductCategoryId; + foreach ($arrNotExistsProductCategoryId as $category_id) { $objQuery->delete('dtb_category_count', 'category_id = ?', array($category_id)); - } - // 差分があったIDとその親カテゴリID - $arrTgtCategoryId = $arrNotExistsProductCategoryId; + $arrParentID = self::sfGetParentsArray('dtb_category', 'parent_category_id', 'category_id', $category_id); + $arrTgtCategoryId = array_merge($arrTgtCategoryId, $arrParentID); + } // dtb_category_countの更新 差分のあったカテゴリだけ更新する。 foreach ($arrNew as $category_id => $count) { @@ -855,7 +858,7 @@ public function sfCountCategory($objQuery = NULL, $is_force_all_count = false, $ $sqlval['category_id'] = $category_id; $objQuery->insert('dtb_category_count', $sqlval); } - $arrParentID = $this->sfGetParents('dtb_category', 'parent_category_id', 'category_id', $category_id); + $arrParentID = self::sfGetParentsArray('dtb_category', 'parent_category_id', 'category_id', $category_id); $arrTgtCategoryId = array_merge($arrTgtCategoryId, $arrParentID); } $arrTgtCategoryId = array_unique($arrTgtCategoryId); From 85f4df6ce00b9141c4a8de172b391e00dedaaaeb Mon Sep 17 00:00:00 2001 From: Seasoft Date: Sat, 17 Feb 2024 03:21:02 +0900 Subject: [PATCH 6/6] =?UTF-8?q?test=20#125=20=E5=BC=B7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SC_Helper_DB_sfCountCategoryTest.php | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tests/class/helper/SC_Helper_DB/SC_Helper_DB_sfCountCategoryTest.php b/tests/class/helper/SC_Helper_DB/SC_Helper_DB_sfCountCategoryTest.php index 72c07a9cbf..9c5a87160a 100644 --- a/tests/class/helper/SC_Helper_DB/SC_Helper_DB_sfCountCategoryTest.php +++ b/tests/class/helper/SC_Helper_DB/SC_Helper_DB_sfCountCategoryTest.php @@ -19,26 +19,49 @@ protected function setUp() public function testSfCountCategory() { + // 全カテゴリに1商品を割り当てる $this->objDb->updateProductCategories($this->category_ids, $this->product_id); $this->objDb->sfCountCategory($this->objQuery); + // 検証 $category_counts = $this->objQuery->select('*', 'dtb_category_count'); + $category_ids = []; foreach ($category_counts as $arrCategoryCount) { - $this->assertTrue(in_array($arrCategoryCount['category_id'], $this->category_ids)); + $category_ids[] = $arrCategoryCount['category_id']; $this->assertEquals(1, $arrCategoryCount['product_count']); } + + // カテゴリに過不足がないことを検証する。 + // TODO: phpUnit 7.5 以降になったら、assertEqualsCanonicalizing を使うべき。ただ、型の違いが無視されるか分からない。(array_diff は無視されるので都合が良い。) + $this->assertSame( + array_diff($category_ids, $this->category_ids), // 過剰を検出 + array_diff($this->category_ids, $category_ids), // 不足を検出 + '不足 (that 側に出力) または過剰 (to 側に出力) がある。' + ); } public function testSfCountCategoryWithTotalCount() { - $this->objDb->addProductBeforCategories($this->category_ids[0], $this->product_id); + // できるだけ深い階層のカテゴリをテスト対象とする。 + $arrCategory = $this->objQuery->getRow('*', 'dtb_category', '0=0 ORDER BY level DESC LIMIT 1'); + + // 商品カテゴリ登録 + $this->objDb->addProductBeforCategories($arrCategory['category_id'], $this->product_id); $this->objDb->sfCountCategory($this->objQuery); + // 検証 $category_total_counts = $this->objQuery->select('*', 'dtb_category_total_count'); - $this->assertCount(1, $category_total_counts); + $this->assertCount((int)$arrCategory['level'], $category_total_counts); foreach ($category_total_counts as $arrCategoryTotalCount) { $this->assertTrue(in_array($arrCategoryTotalCount['category_id'], $this->category_ids)); $this->assertEquals(1, $arrCategoryTotalCount['product_count']); } + + // 商品カテゴリ削除 + $this->objDb->removeProductByCategories($arrCategory['category_id'], $this->product_id); + $this->objDb->sfCountCategory($this->objQuery); + // 検証 + $category_ids = $this->objQuery->getCol('category_id', 'dtb_category_total_count'); + $this->assertEmpty($category_ids, 'dtb_category_total_count にデータが残っている。: ' . var_export($category_ids, true)); } public function testSfCountCategoryWithNoStockHidden() @@ -79,7 +102,6 @@ public function setUpCategories() $delete_tables = ['dtb_category', 'dtb_product_categories', 'dtb_category_total_count', 'dtb_category_count']; foreach ($delete_tables as $table) { $this->objQuery->delete($table); - } $this->product_id = $this->objGenerator->createProduct();