2

私はプレスタショップでの経験がありません。その属性の値に一致するすべての製品を取得しようとしています。

[編集]

今、私はを使用してすべての製品を取得しますProduct::getProducts。その後、array_filterで結果の配列をフィルタリングします。フィルタリングがデータベースで行われている場合に、フィルタリングされた製品を直接取得する方法について疑問に思っています。例えば。次のような関数または文字列フィルターを渡す Product::getProductsBy( 'product_id > 10')

4

2 に答える 2

7

簡単に言うと、これを実行できるものは組み込まれていませんが、正しく理解している場合は、特定の属性値を持つ製品のリストを適切な形式で製品リストを使用して出力する必要があります。テーマテンプレート。

グループ内の属性値のドロップダウンリストから開始すると仮定します。そのため、属性のグループ化は完全に無視できます。たとえばid_attribute_group = 1、選択可能な値「M」と「L」を持つ属性グループ「Size」()があるとします。後者はXX_attributeテーブルのエントリに対応します。

XX_attributeテーブルには

id_attribute | id_attribute_group | color
1            | 1                  | #000000
2            | 1                  | #000000

XX_attribute_langテーブルには次のようになります

id_attribute | id_lang            | name
1            | 1                  | M
2            | 1                  | L

カテゴリなどを気にしないと仮定すると、サイズ「L」で利用可能なすべての製品を取得するには、次のような単純なクエリを使用できます。

SELECT pa.`id_product` FROM `XX_product_attribute` pa
LEFT JOIN `XX_product_attribute_combination` pac ON pa.`id_product_attribute` = pac.`id_product_attribute`
WHERE pac.`id_attribute` = '2'

次に、Prestashopが内部で使用する機能を基本的に複製して、上記で取得したproduct_idの配列の商品の詳細を取得し、商品リストテンプレートに渡す必要があります。言語、通貨、税金などの製品データを後処理する必要があるため、この段階で製品IDのみを取得するのがおそらく最善のアプローチです。

上記から構築されたIDの配列または同様のフィルタリングクエリ(たとえば、と呼ばれる配列に格納されている$product_ids)から詳細な製品データを取得するには、次のような操作を行う必要があります。

global $cookie;
$id_lang = $cookie->id_lang;
$product_list = array();

if (count($product_ids))
{
  $sql = '
  SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new,
    (p.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice
  FROM `'._DB_PREFIX_.'category_product` cp
  LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
  LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1)
  LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($id_lang).')
  LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).')
  LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
  LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).')
  LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group`
                                             AND tr.`id_country` = '.(int)Country::getDefaultCountryId().'
                                               AND tr.`id_state` = 0)
    LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
  LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).')
  LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer`
  WHERE p.`active` = 1' : '').'
        '.($id_supplier ? 'AND p.id_supplier = '.(int)($id_supplier) : '').'
  AND p.`id_product` IN(' . implode(',', $product_ids) . ')';

  $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql);


  /* Modify SQL result */
  $product_list = Product::getProductsProperties($id_lang, $result);
}

明らかに、私はIN()を使用して結果を製品セットにフィルターしました。これは、多くの製品では扱いにくいものですが、一般的な考え方を示しています。もう1つの問題は、上記のクエリがPrestashopの他の場所で同様の機能からほとんど削除されており(どこかで誤って編集した場合はお詫びします)、アップグレード時に機能しなくなる可能性があることです。

于 2012-02-07T10:48:18.833 に答える
0

パウロが上で述べたように、あなたの質問は非常に曖昧であり、追加情報なしでは適切に答えることが難しいかもしれません。しかし、私はいくつかの潜在的な解決策を提供しようとします:

iPodなど、色とサイズのオプションを備えた特定の製品を購入する場合は、カタログの[属性とグループ]タブと[組み合わせジェネレータ]を使用して購入できます。

価格、機能、色などのパラメーターに基づいて商品のリストを絞り込む場合(たとえば、Amazon.comでの買い物方法を考えてみてください)、組み込みのレイヤードを使用してこれを構成できます。ナビゲーションモジュール。

これらのいずれもあなたの質問に対応していない場合は、あなたが何を求めているのかをよりよく理解するのに役立つ追加情報を投稿してください。

出典:私はPrestaShopのコミュニティマネージャーです

于 2012-02-06T16:20:21.990 に答える