Pesquise produtos em uma categoria específica
Estou tentando estender o comportamento padrão do mecanismo de pesquisa fornecido pelo módulo padrãoblocksearch
no Prestashop 1.6.0.6.
Eu adicionei ao formulário padrão umselect
categorias retornadas de entrada.
Tudo está funcionando nos lados do controlador e da vista. O formulário inteiro está enviando o parâmetro correto para oSearchController
. Mas, no Modelo, ainda não sei quais são as alterações a serem aplicadasSearch.php
entidade para que o métodofind
retorna produtos que pertencem à categoria especificada. Passei um bom tempo tentando entender como o mecanismo de pesquisa emfind
funciona, mas sem sucesso. Alguém pode me indicar a parte do código em questão? onde adicionar minhas condiçõescategory_id
no SQL?
Editar: Entre todas as consultas sql emSearch::find
método, acho que o seguinte é o interessado. Na verdade, eu adicioneiAND p.'id_manufacturer' ='.(int)$manufacturer_id.'
e eu posso ver mudanças. Mas para categorias, parece mais complicado, acho que preciso de umJOIN
algum lugar. Receio criar coisas que aparentemente funcionem, mas que são criadas sem respeitar as melhores práticas. Por favor, para me ajudar eu sou um novato em 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;
Editar número 2: solução temporária
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.' )';