Wchodząc do kategorii "X" w sidebarze mam filtr subkategorii. Jeśli zaznaczę subkategorię "Y" to wyświetlają mi się produkty z subkategorii "Y". Jeśli zaznaczę np. dwie subkategorię "Y" i "Z" to wyświetlają mi się wszystkie produkty z obydwu kategorii.
Chciałbym aby zaznaczając kategorię "Y" i "Z" wyświetlały mi się tylko produkty które są przypisane do tych dwóch kategorii.
Jeśli produkt "XYZ" jest tylko w kategorii "Y", to zaznaczając na filtrze kategorie "Y" i "Z" nie powinien zostać on wyświetlony.
Jeśli produkt "ABC" jest przypisany do kategorii "Y" i "Z" to zaznaczając na filtrze kategorie "Y" i "Z" powinien zostać on wyświetlony.
Mam nadzieję że wyraziłem się dosyć jasno. Wiem że trzeba zmienić zapytanie do bazy. Próbowałem pozmieniać "OR" na "AND" w jakiś zapytaniach w pliku /modules/blocklayered/blocklayerde.php ale nic z tego nie wyszło.
Bardzo proszę o pomoc lub chociaż jakieś nakierowane.
Wydaje mi się że tutaj trzeba coś zmenić:
Plik /modules/blocklayered/blocklayered.php/ linia 1809
switch ($key)
{
case 'id_feature':
$sub_queries = array();
foreach ($filter_values as $filter_value)
{
$filter_value_array = explode('_', $filter_value);
if (!isset($sub_queries[$filter_value_array[0]]))
$sub_queries[$filter_value_array[0]] = array();
$sub_queries[$filter_value_array[0]][] = 'fp.`id_feature_value` = '.(int)$filter_value_array[1];
}
foreach ($sub_queries as $sub_query)
{
$query_filters_where .= ' AND p.id_product IN (SELECT `id_product` FROM `'._DB_PREFIX_.'feature_product` fp WHERE ';
$query_filters_where .= implode(' OR ', $sub_query).') ';
}
break;
case 'id_attribute_group':
$sub_queries = array();
foreach ($filter_values as $filter_value)
{
$filter_value_array = explode('_', $filter_value);
if (!isset($sub_queries[$filter_value_array[0]]))
$sub_queries[$filter_value_array[0]] = array();
$sub_queries[$filter_value_array[0]][] = 'pac.`id_attribute` = '.(int)$filter_value_array[1];
}
foreach ($sub_queries as $sub_query)
{
$query_filters_where .= ' AND p.id_product IN (SELECT pa.`id_product`
FROM `'._DB_PREFIX_.'product_attribute_combination` pac
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
ON (pa.`id_product_attribute` = pac.`id_product_attribute`)'.
Shop::addSqlAssociation('product_attribute', 'pa').'
WHERE '.implode(' OR ', $sub_query).') ';
}
break;
case 'category':
$query_filters_where .= ' AND p.id_product IN (SELECT id_product FROM '._DB_PREFIX_.'category_product cp WHERE ';
foreach ($selected_filters['category'] as $id_category)
$query_filters_where .= 'cp.`id_category` = '.(int)$id_category.' OR ';
$query_filters_where = rtrim($query_filters_where, 'OR ').')';
break;
case 'quantity':
if (count($selected_filters['quantity']) == 2)
break;
$query_filters_where .= ' AND sa.quantity '.(!$selected_filters['quantity'][0] ? '<=' : '>').' 0 ';
$query_filters_from .= 'LEFT JOIN `'._DB_PREFIX_.'stock_available` sa ON (sa.id_product = p.id_product '.StockAvailable::addSqlShopRestriction(null, null, 'sa').') ';
break;
case 'manufacturer':
$query_filters_where .= ' AND p.id_manufacturer IN ('.implode($selected_filters['manufacturer'], ',').')';
break;
case 'condition':
if (count($selected_filters['condition']) == 3)
break;
$query_filters_where .= ' AND '.$alias_where.'.condition IN (';
foreach ($selected_filters['condition'] as $cond)
$query_filters_where .= '\''.pSQL($cond).'\',';
$query_filters_where = rtrim($query_filters_where, ',').')';
break;
case 'weight':
if ($selected_filters['weight'][0] != 0 || $selected_filters['weight'][1] != 0)
$query_filters_where .= ' AND p.`weight` BETWEEN '.(float)($selected_filters['weight'][0] - 0.001).' AND '.(float)($selected_filters['weight'][1] + 0.001);
break;
case 'price':
if (isset($selected_filters['price']))
{
if ($selected_filters['price'][0] !== '' || $selected_filters['price'][1] !== '')
{
$price_filter = array();
$price_filter['min'] = (float)($selected_filters['price'][0]);
$price_filter['max'] = (float)($selected_filters['price'][1]);
}
}
else
$price_filter = false;
break;
}
}
Question
hehe222
Wchodząc do kategorii "X" w sidebarze mam filtr subkategorii. Jeśli zaznaczę subkategorię "Y" to wyświetlają mi się produkty z subkategorii "Y". Jeśli zaznaczę np. dwie subkategorię "Y" i "Z" to wyświetlają mi się wszystkie produkty z obydwu kategorii.
Chciałbym aby zaznaczając kategorię "Y" i "Z" wyświetlały mi się tylko produkty które są przypisane do tych dwóch kategorii.
Jeśli produkt "XYZ" jest tylko w kategorii "Y", to zaznaczając na filtrze kategorie "Y" i "Z" nie powinien zostać on wyświetlony.
Jeśli produkt "ABC" jest przypisany do kategorii "Y" i "Z" to zaznaczając na filtrze kategorie "Y" i "Z" powinien zostać on wyświetlony.
Mam nadzieję że wyraziłem się dosyć jasno. Wiem że trzeba zmienić zapytanie do bazy. Próbowałem pozmieniać "OR" na "AND" w jakiś zapytaniach w pliku /modules/blocklayered/blocklayerde.php ale nic z tego nie wyszło.
Bardzo proszę o pomoc lub chociaż jakieś nakierowane.
Wydaje mi się że tutaj trzeba coś zmenić:
Plik /modules/blocklayered/blocklayered.php/ linia 1809
Edited by hehe222 (see edit history)Link to comment
Share on other sites
1 answer to this question
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now