[Tep-j-general] 表示されていない商品が検索されるのですが。

Back to archive index

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*****>




Tep-j-general メーリングリストの案内
Back to archive index