Поиск товаров в определенной категории
Я пытаюсь расширить поведение по умолчанию для механизма поиска, предоставляемого модулем по умолчаниюblocksearch
в Prestashop 1.6.0.6.
Я добавил в форму по умолчаниюselect
входные возвращающие категории.
Все работает как в контроллере, так и в сторонах. Вся форма отправляет правильный параметрSearchController
, Но в модели я до сих пор не знаю, какие изменения применитьSearch.php
сущность, так что методfind
возвращает товары, которые относятся к указанной категории. Я провел хорошее время, пытаясь понять, как механизм поиска вfind
работает но безрезультатно. Может кто-нибудь указать мне заинтересованную часть кода? где добавить мои условия наcategory_id
в SQL?
Редактировать: Среди всех запросов SQL вSearch::find
метод, я думаю, что следующий заинтересованный. На самом деле я добавил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;
Изменить номер 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.' )';