Mineaki Gotoh
gij****@peak*****
2002年 11月 2日 (土) 10:14:18 JST
高橋さん、おはようございます。後藤です。 >> 旧TEP-J の9/27から始まるスレッド「カテゴリーとメーカーの関係」で、鈴 >> 川さんが書かれているように、catalog(表示)側で調整するのは、相当に大 >> 変です。 > 表示で調整するのでなく、検索のときに対象外とすると言うのはどうな >のでしょうか。 > でも、カテゴリの状態を見て検索するというのは、所属するカテゴリの >状態を全部 > 調べなければいけないから、難しいですね。 誤解を招く書き方だったかもしれませんが、表示側=検索条件です。もっと 正確には、MySQLに発行するSELECTクエリの条件です。 表示側には、こんなSELECTクエリが、いっぱいあるんです。今思い浮かぶだけでも、 ・新着商品 ・こんな商品も買ってます ・ベストセラー ・特価商品 ・カスタマー ……と枚挙にいとまがありません。 所属するカテゴリの状態をすべて調べること自体は、それほど難しくはない のですが、それらの関連ファイルすべてを修正するのは、現実的ではないだ ろう、という話です。 >> 少しでもご希望を実装するなら、やはり鈴川さんの提案するように、admin画 >> 面で、カテゴリーに赤ランプを点すと、その内部のカテゴリー・商品がすべ >> て赤ランプになる、という改造が現実的です。 > 今は、カテゴリのステータスをON/OFF にすると、そのサブカテゴリの設定も > 同時にON/OFFするようになっているようですが、これに商品のステータスも含 > まれるようになるという事ですね。 > おっしゃる通りです。 その仕様で、ざっと実装してみました。簡単なチェックだけはしてあります。 admin/includes/functions/general.php の関数 tep_set_category_status() だけを変更します。 //// // Sets the status of a product function tep_set_category_status($category_id, $status) { if ($status == '1') { tep_db_query("update " . TABLE_CATEGORIES . " set status = '1', last_modified = now() where categories_id = '" . $category_id . "'"); $tree = tep_get_category_tree($category_id); $target_categories[0] = $category_id ; // 追加 for ($i=1; $i<sizeof($tree); $i++) { tep_db_query("update " . TABLE_CATEGORIES . " set status = '1', last_modified = now() where categories_id = '" . $tree[$i]['id'] . "'"); $target_categories[$i] = $tree[$i]['id'] ; // 追加 } // ここから追加 $db_query = tep_db_query("SELECT products_id FROM " . TABLE_PRODUCTS_TO_CATEGORIES . " WHERE categories_id in (" . implode( ',' , $target_categories ) . ") " ) ; while( $p = tep_db_fetch_array( $db_query ) ) $s .= $p['products_id'] . "," ; $products_list = substr( $s , 0 , -1 ) ; tep_db_query("UPDATE " . TABLE_PRODUCTS . " SET products_status = '1', products_last_modified = NOW() WHERE products_id in ($products_list)"); // ここまで } elseif ($status == '0') { tep_db_query("update " . TABLE_CATEGORIES . " set status = '0', last_modified = now() where categories_id = '" . $category_id . "'"); $tree = tep_get_category_tree($category_id); $target_categories[0] = $category_id ; // 追加 for ($i=1; $i<sizeof($tree); $i++) { tep_db_query("update " . TABLE_CATEGORIES . " set status = '0', last_modified = now() where categories_id = '" . $tree[$i]['id'] . "'"); $target_categories[$i] = $tree[$i]['id'] ; // 追加 } // ここから追加 $db_query = tep_db_query("SELECT products_id FROM " . TABLE_PRODUCTS_TO_CATEGORIES . " WHERE categories_id in (" . implode( ',' , $target_categories ) . ") " ) ; // 手直しするならここ while( $p = tep_db_fetch_array( $db_query ) ) $s .= $p['products_id'] . "," ; $products_list = substr( $s , 0 , -1 ) ; tep_db_query("UPDATE " . TABLE_PRODUCTS . " SET products_status = '0', products_last_modified = NOW() WHERE products_id in ($products_list)"); // ここまで } } 実はこのコードだと一つ問題があり、複数のカテゴリーに含まれる商品があっ た場合、そのうちの一つのカテゴリーだけをOFFにすると、他のカテゴリーが ONでも、該当商品はOFFになってしまいます。 OFFにする商品一覧を取得するSQLで、products_to_categoriesテーブルだけ でなく、categoriesテーブルも見て、所属するグループがすべてOFFの時のみ、 というWHERE節にする必要がありますが、そんな複雑なSQLがMySQLで通るかど うかわかりませんし、私自身、ぱっと思い浮かびません。 なお、一つの商品を複数カテゴリーにリンクで登録していなければ、この問 題は発生しません。 -- 株式会社PEAK ネットワーク技術担当 後藤 <gij****@peak*****>