Перейти к содержанию
Официальный форум поддержки Simpla

не выводить товары из категории


Перейти к решению Решено yr4ik,

Рекомендуемые сообщения

не проверял но примерно так:

 

1) /api/Products.php заменить 2 строки (в функциях count_products и get_products):

$category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id in(?@)', (array)$filter['category_id']);

на:

$category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id '.(!empty($filter['excluded']) ? 'NOT ':'').'in(?@)', (array)$filter['category_id']);

2) /view/ProductsView.php перед:

// Постраничная навигация
$items_per_page = $this->settings->products_num;	

 

Добавляем код:

//Если не поиск не категория и не товары бренда
if(!isset($filter['keyword']) &&  !isset($filter['category_id']) && !isset($filter['brand_id']) && ($excluded=$this->categories->get_category(6))){
	$filter['excluded'] = true;
	$filter['category_id'] = $excluded->children;
}
Изменено пользователем yr4ik
Ссылка на сообщение
Поделиться на другие сайты

не проверял но примерно так:

 

Зря не проверял...

 

Код приводит к тому, что на страницах категорий выводятся почти ВСЕ товары ВСЕХ категорий (кроме категории 6 и нижерасположенных).

Структура каталога убивается напрочь...

Ссылка на сообщение
Поделиться на другие сайты

Похоже, Вы решили позабавиться и подшутить над пользователями.

Иначе не знаю, чем объяснить то, что выкладываете уже ВТОРОЕ очевидно неправильное решение, с грубейшей ошибкой, которая должна сразу бросаться в глаза...

Ссылка на сообщение
Поделиться на другие сайты

Похоже, Вы решили позабавиться и подшутить над пользователями.

Иначе не знаю, чем объяснить то, что выкладываете уже ВТОРОЕ очевидно неправильное решение, с грубейшей ошибкой, которая должна сразу бросаться в глаза...

 

Я решил тебя по*бывать! Но похоже тебя в этом деле не переплюнешь! 

Видишь проблему - пиши! Нет иди в другую тему...

Ссылка на сообщение
Поделиться на другие сайты

Рассмотрим, например, случай страницы бренда.
В стандарте Simpla, если открыть страницу бренда, то на ней будут показаны, в частности, и товары категории ID=6, относящиеся к бренду.
При Вашей доработке будет ТО ЖЕ САМОЕ, так как условие в п.2) ЛОЖНО.
 

Ссылка на сообщение
Поделиться на другие сайты

Правильно. ТС это и указал! 

 


как на странице /products  не выводить товары из категории id=6 и его субкатегорий?

 

Страница бренда это страница "products/" ?

Изменено пользователем yr4ik
Ссылка на сообщение
Поделиться на другие сайты

Я понял так, что страница "/products" - это разные страницы, у которых так начинается URL.  А если считать одну страницу с таким URL в точности, тогда Ваше второе решение - верное...

 

ТС, конечно, виднее, но как по мне, неестественно скрывать товары из категории на /products и не скрывать на странице бренда, или более того, поиска...  

Ссылка на сообщение
Поделиться на другие сайты

Ну даже если ТС нужно это в поиске и тд - то я специально писал комментарий:

 

 

//Если не поиск не категория и не товары бренда

if(!isset($filter['keyword']) &&  !isset($filter['category_id']) && !isset($filter['brand_id']) &&

 

Причем в том же порядке как и стоять блокировки

Изменено пользователем yr4ik
Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

 

не проверял но примерно так:

 

1) /api/Products.php заменить 2 строки (в функциях count_products и get_products):

$category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id in(?@)', (array)$filter['category_id']);

на:

$category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id '.(!empty($filter['excluded']) ? 'NOT ':'').'in(?@)', (array)$filter['category_id']);

2) /view/ProductsView.php перед:

// Постраничная навигация
$items_per_page = $this->settings->products_num;	

 

Добавляем код:

//Если не поиск не категория и не товары бренда
if(!isset($filter['keyword']) &&  !isset($filter['category_id']) && !isset($filter['brand_id']) && ($excluded=$this->categories->get_category(6))){
	$filter['excluded'] = true;
	$filter['category_id'] = $excluded->children;
}

 

А как сделать чтоб товары из этих же категорий не выводились в строке поиска?

Изменено пользователем KostyanBr
Ссылка на сообщение
Поделиться на другие сайты

А как сделать чтоб товары из этих же категорий не выводились в строке поиска?

 

Убрать в проверке

!isset($filter['keyword']) &&
Ссылка на сообщение
Поделиться на другие сайты

 

Убрать в проверке

!isset($filter['keyword']) &&

убрано. На странице поиска не выводится, но нужно убрать в живом поиске еще. 

Ссылка на сообщение
Поделиться на другие сайты

Тогда в ajax/search_products.php заменить запрос к БД на код:

 

$excluded = $simpla->categories->get_category(6);

$product_sql = 'SELECT p.id, p.name, i.filename as image FROM __products p
						LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1) ';

if(!empty($excluded))
	$product_sql .= $simpla->db->placehold('LEFT JOIN __products_categories pc ON (pc.product_id = p.id)
		WHERE pc.category_id NOT IN (?@) AND ', $excluded->children);
else
	$product_sql .= 'WHERE ';

$product_sql .= "(p.name LIKE '%$kw%' OR p.meta_keywords LIKE '%$kw%' OR p.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%')) AND visible=1 GROUP BY p.id ORDER BY p.name LIMIT ?";

$simpla->db->query($product_sql, $limit);

PS: Код не проверял

Ссылка на сообщение
Поделиться на другие сайты

Тогда в ajax/search_products.php заменить запрос к БД на код:

 

$excluded = $simpla->categories->get_category(6);

$product_sql = 'SELECT p.id, p.name, i.filename as image FROM __products p
						LEFT JOIN __images i ON i.product_id=p.id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1) ';

if(!empty($excluded))
	$product_sql .= $simpla->db->placehold('LEFT JOIN __products_categories pc ON (pc.product_id = p.id)
		WHERE pc.category_id NOT IN (?@) AND ', $excluded->children);
else
	$product_sql .= 'WHERE ';

$product_sql .= "(p.name LIKE '%$kw%' OR p.meta_keywords LIKE '%$kw%' OR p.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%')) AND visible=1 GROUP BY p.id ORDER BY p.name LIMIT ?";

$simpla->db->query($product_sql, $limit);

PS: Код не проверял

 

Ох, зря проигнорировал проверку...

 

 

Спасибо. Все отлично работает.

 

Поздравляю, Вам повезло.

Потому как вообще код неверный, ибо содержит серьезную логическую ошибку. Автор, вероятно, считал, что у товара может быть только одна категория, а это совсем не так. Работает этот метод, похоже, только в простейших ситуациях - именно, когда у товара лишь одна категория.

 

Например, если товар относится к категории ID=6 и к еще одной посторонней категории ID=72, то такой товар будет показываться, в то время как не должен...

 

Эта же ошибка наблюдается и в способе от yr4ik-а из поста #2 этой темы...

Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

 

не проверял но примерно так:

 

1) /api/Products.php заменить 2 строки (в функциях count_products и get_products):

$category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id in(?@)', (array)$filter['category_id']);

на:

$category_id_filter = $this->db->placehold('INNER JOIN __products_categories pc ON pc.product_id = p.id AND pc.category_id '.(!empty($filter['excluded']) ? 'NOT ':'').'in(?@)', (array)$filter['category_id']);

2) /view/ProductsView.php перед:

// Постраничная навигация
$items_per_page = $this->settings->products_num;	

 

Добавляем код:

//Если не поиск не категория и не товары бренда
if(!isset($filter['keyword']) &&  !isset($filter['category_id']) && !isset($filter['brand_id']) && ($excluded=$this->categories->get_category(6))){
	$filter['excluded'] = true;
	$filter['category_id'] = $excluded->children;
}

Друзья, с одной категорией (id=6) работает, а как это же условие задать для двух категорий?

Ссылка на сообщение
Поделиться на другие сайты
  • Решение

Друзья, с одной категорией (id=6) работает, а как это же условие задать для двух категорий?

 

если без дочерних категорий то можно так:

$filter['excluded'] = true;
$filter['category_id'] = array(id1, id2, id и тд);

если дочерние есть или их много то как то так:

$filter['excluded'] = true;
$filter['category_id'] = array();
$executed_ids = array(id1, id2, id и тд);
foreach($executed_ids as $id)
{
	if($executed=$this->categories->get_category($id))
		$filter['category_id'] = array_merge($filter['category_id'], $executed->children);
}
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...