2014-07-15 89 views
2

我试图扩展Prestashop 1.6.0.6中默认模块blocksearch提供的搜索机制的默认行为。搜索特定类别的产品

我添加到默认窗体select输入返回类别。

一切都在控制器和视图两方面工作。整个表单将正确的参数发送到SearchController。但是,在模型中,我仍然不知道要对Search.php实体应用哪些更改,以便方法find返回属于指定类别的产品。 我花了很长时间试图了解find的搜索机制如何工作,但无济于事。有人可以指点我的代码的有关部分?哪里可以在SQL中添加我的条件category_id

编辑:Search::find方法的所有sql查询中,我认为下面的一个是有关的。实际上,我添加了AND p.'id_manufacturer' ='.(int)$manufacturer_id.',我可以看到更改。但对于类别,它似乎更复杂,我认为我需要一个JOIN某处。我恐怕会建立一些看起来可以工作的东西,但是它们并不尊重最佳实践。请帮我我是一个新手在SQL。

$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, 
       pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`, 
      MAX(image_shop.`id_image`) id_image, il.`legend`, m.`name` manufacturer_name '.$score.', MAX(product_attribute_shop.`id_product_attribute`) id_product_attribute, 
       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 new 
       FROM '._DB_PREFIX_.'product p 
       '.Shop::addSqlAssociation('product', 'p').' 
       INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (
        p.`id_product` = pl.`id_product` 
        AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').' 
       ) 
       LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product`) 
       '.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1').' 
       '.Product::sqlStock('p', 'product_attribute_shop', false, $context->shop).' 
       LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` 
       LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'. 
       Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').' 
       LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') 
       WHERE p.`id_product` '.$product_pool.' 
           AND p.`id_manufacturer` ='.(int)$manufacturer_id.' 
       GROUP BY product_shop.id_product 
       '.($order_by ? 'ORDER BY '.$alias.$order_by : '').($order_way ? ' '.$order_way : '').' 
       LIMIT '.(int)(($page_number - 1) * $page_size).','.(int)$page_size; 

编辑NUMERO 2:治标不治本

if($category_id!=0) $sql=$sql.' AND p.`id_product` IN (SELECT `id_product` FROM `ps_category_product` p WHERE p.`id_category`='.(int)$category_id.' )'; 

回答

1

你可以用这个

$sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, 
      pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`, 
     MAX(image_shop.`id_image`) id_image, il.`legend`, m.`name` manufacturer_name '.$score.', MAX(product_attribute_shop.`id_product_attribute`) id_product_attribute, 
      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 new 
      FROM `'._DB_PREFIX_.'category_product` cp 
      LEFT JOIN `'._DB_PREFIX_.'product` p 
       ON p.`id_product` = cp.`id_product` 

      '.Shop::addSqlAssociation('product', 'p').' 
      INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (
       p.`id_product` = pl.`id_product` 
       AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').' 
      ) 

      LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product`) 
      '.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1').' 
      '.Product::sqlStock('p', 'product_attribute_shop', false, $context->shop).' 
      LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` 
      LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'. 
      Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').' 
      LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') 
      WHERE p.`id_product` '.$product_pool.' 
          AND p.`id_manufacturer` ='.(int)$manufacturer_id.' AND cp.id_lang ='.(int)$id_category.' 
      GROUP BY product_shop.id_product 
      '.($order_by ? 'ORDER BY '.$alias.$order_by : '').($order_way ? ' '.$order_way : '').' 
      LIMIT '.(int)(($page_number - 1) * $page_size).','.(int)$page_size; 

其中(INT)$ id_category是id_category(从选择)和category_product尝试是存储产品和类别之间关系的表格

希望这有助于。

+0

我会尝试阅读它,当我有时间(我不再进入PS了)。希望它能帮助别人。 +1 –

+1

我认为这个问题是最近的:\,希望它可以帮助别人,并感谢+1 –

相关问题