ホームページ >バックエンド開発 >PHPチュートリアル >【PHPオープンソースプロダクト】Ecshopのプロダクトフィルタリング機能の解析の一つ(主にcategory.phpの解析)_PHPチュートリアル
①個人的にショッピングモールの商品フィルタリング機能の実装に興味があります
② モール内の商品のデータテーブルのデザインに興味があります。 (この関数にはデータベースとの対話が含まれており、データベース内のデータ テーブルの設計と一定の関係があります);
③ 複数条件(属性)フィルタリング機能は、今日多くの Web サイトで必要とされており、非常に普及しています (例: 一般ショッピング サイト、共同購入 Web サイト、不動産 Web サイト、情報分類 Web サイトなど)。(2) 私たちが達成したいことは次のとおりです:
②複数条件フィルタリングの実装では、データベースをより最適化して合理的に設計するにはどうすればよいですか (以前の経験を参照)。
③複数条件スクリーニングにおけるいくつかの戦略またはテクニックを理解する(いくつかのポイントを要約します)
2. それでは、まず今の需要を見てみましょう。 (複数条件のフィルタリングについては、JD.com、Suning、Gome などを参照してください)
①JD.comの製品フィルタリング機能(スクリーンショット):
②Suning Mallの商品フィルタリング機能(スクリーンショット)
③Gome Onlineの商品フィルタリング機能(スクリーンショット)
補足: この関数を観察するには、アドレスバーについても考える必要があります。結局のところ、このように分析すると簡単になります。上記の例はほんの紹介にすぎません。後で改善します。
④ECSHOPの商品フィルタリング機能が実装されており、表示内容(スクリーンショット+テキスト)は以下の通りです:
1) まず、私のローカルサーバーには、このマシンにインストールされている ecshop デモ Web サイトの仮想ホスト アドレスがあります:
「GSM 携帯電話」
カテゴリに属する製品を表示します。以下の通り:
結果ページは次のとおりです:
アクセスアドレスは:
結果ページは次のとおりです:
分析: アドレスバーの変更と上記のスクリーンショットから、ecshop の複数条件検索方法がどのようなものであるかが最初にわかります。
推測 1:
ユーザーが商品をフィルタリングするために条件 (属性) をクリックするたびに、検索アドレス バーが変化するのはなぜですか?最終的には、それはハイパーリンク アドレスである必要があります。各商品属性のタグを変更しました。クリックするたびに検索条件が変わります。 したがって、この属性のハイパーリンクは動的に生成されることがわかります。
ecshop はバックグラウンドで多くの判断を行い、最終的に最後の検索条件が失われないように、商品属性ごとにハイパーリンク アドレスを生成したに違いありません。推測 2: 製品の価格帯はどのような基準に基づいて計算されますか?
まだバックグラウンドで手動で設定されています。JD.com の製品の価格帯は非常に一定しているようで、ecshop の価格帯とは大きく異なります。あまり心配せず、まずはecshopについて勉強してみましょう。推測 3: パラメータfilter_attr=163.0.160.0の数字は、色、画面サイズ、電話モード、および外観スタイルの属性でどの値が選択されているかを表す必要があります。
----> これらの質問を踏まえて、ecshop が上記の複数条件検索機能をどのように実装しているかを直接調べてみましょう。 。 。行く。 。 。
まず、ecshop Web サイトに移動してディレクトリを変更し、category.php ファイルを見つけて開き、学習します。
('IN_ECS', (() . '/includes/init.php' ((DEBUG_MODE & 2) != 2 ->キャッシュ = ((['id' = (['id' ((['カテゴリ' = (['カテゴリ' ) } ecs_header("場所: ./n" このパラメータがない場合、このパラメータは検索に使用されず、デフォルトでデフォルト値が与えられることを意味します。 = (['page']) && (['page']) > 0 ? (['page']) : 1 = (['page_size']) && (['page_size']) > 0 ? (['page_size']) : 10 = (['brand']) && (['brand']) > 0 ? (['ブランド']) : 0 = (['price_max']) && (['price_max']) > 0 ? (['price_max']) : 0 = (['price_min']) && (['price_min']) > 0 ? (['price_min']) : 0 = (['filter_attr']) ? ((['filter_attr'])) : '0' = ( = () ? '' : ('.', ( = ['show_order_type'] == '0' ? 'list' : (['show_order_type'] == '1' ? 'grid' : 'text' = ['sort_order_method'] == '0' ? 'DESC' : 'ASC' = ['sort_order_type'] == '0' ? 'goods_id' : (['sort_order_type'] == '1' ? 'shop_price' : 'last_update' = ((['sort']) && ((([' sort'])), ('goods_id', 'shop_price', 'last_update'))) ? (['sort']) : = ((['order']) && ((([ 'order'])), ('ASC', 'DESC'))) ? (['order']) : = ((['display']) && ((([ 'display'])), ('list', 'grid', 'text'))) ? (['display']) : ((['ECS']['display']) ? ['ECS'] ['display'] : = (, ('list', 'grid', 'text')) ? : 'text' ('ECS[display]', , gmtime() + 86400 * 7 = ('%X', ( . '-' . . '-' . .'-' . .'-' . . '-' ['lang'] .'-'。 。 「-」。 。 '-' . 。 「-」。 (!->is_cached('category.dwt', = get_children( = get_cat_info( ( > 0 = "SELECT brand_name FROM " .['ecs']->table('brand'). " WHERE brand_id = ''" = ->getOne ( } = ''