shooroop Опубликовано 27 февраля, 2016 Жалоба Поделиться Опубликовано 27 февраля, 2016 как на странице /products не выводить товары из категории id=6 и его субкатегорий? Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 (изменено) не проверял но примерно так: 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; } Изменено 28 февраля, 2016 пользователем yr4ik Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 не проверял но примерно так: Зря не проверял... Код приводит к тому, что на страницах категорий выводятся почти ВСЕ товары ВСЕХ категорий (кроме категории 6 и нижерасположенных). Структура каталога убивается напрочь... Цитата Ссылка на сообщение Поделиться на другие сайты
shooroop Опубликовано 28 февраля, 2016 Автор Жалоба Поделиться Опубликовано 28 февраля, 2016 действительно переключение по категориям каталога перестает работать Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 Пункт 2 поправил Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 Похоже, Вы решили позабавиться и подшутить над пользователями.Иначе не знаю, чем объяснить то, что выкладываете уже ВТОРОЕ очевидно неправильное решение, с грубейшей ошибкой, которая должна сразу бросаться в глаза... Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 Похоже, Вы решили позабавиться и подшутить над пользователями.Иначе не знаю, чем объяснить то, что выкладываете уже ВТОРОЕ очевидно неправильное решение, с грубейшей ошибкой, которая должна сразу бросаться в глаза... Я решил тебя по*бывать! Но похоже тебя в этом деле не переплюнешь! Видишь проблему - пиши! Нет иди в другую тему... Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 Рассмотрим, например, случай страницы бренда.В стандарте Simpla, если открыть страницу бренда, то на ней будут показаны, в частности, и товары категории ID=6, относящиеся к бренду.При Вашей доработке будет ТО ЖЕ САМОЕ, так как условие в п.2) ЛОЖНО. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 (изменено) Правильно. ТС это и указал! как на странице /products не выводить товары из категории id=6 и его субкатегорий? Страница бренда это страница "products/" ? Изменено 28 февраля, 2016 пользователем yr4ik Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 Я понял так, что страница "/products" - это разные страницы, у которых так начинается URL. А если считать одну страницу с таким URL в точности, тогда Ваше второе решение - верное... ТС, конечно, виднее, но как по мне, неестественно скрывать товары из категории на /products и не скрывать на странице бренда, или более того, поиска... Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 28 февраля, 2016 Жалоба Поделиться Опубликовано 28 февраля, 2016 (изменено) Ну даже если ТС нужно это в поиске и тд - то я специально писал комментарий: //Если не поиск не категория и не товары брендаif(!isset($filter['keyword']) && !isset($filter['category_id']) && !isset($filter['brand_id']) && Причем в том же порядке как и стоять блокировки Изменено 28 февраля, 2016 пользователем yr4ik Цитата Ссылка на сообщение Поделиться на другие сайты
KostyanBr Опубликовано 15 апреля, 2016 Жалоба Поделиться Опубликовано 15 апреля, 2016 (изменено) не проверял но примерно так: 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; } А как сделать чтоб товары из этих же категорий не выводились в строке поиска? Изменено 15 апреля, 2016 пользователем KostyanBr Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 15 апреля, 2016 Жалоба Поделиться Опубликовано 15 апреля, 2016 А как сделать чтоб товары из этих же категорий не выводились в строке поиска? Убрать в проверке !isset($filter['keyword']) && Цитата Ссылка на сообщение Поделиться на другие сайты
KostyanBr Опубликовано 15 апреля, 2016 Жалоба Поделиться Опубликовано 15 апреля, 2016 Убрать в проверке !isset($filter['keyword']) && убрано. На странице поиска не выводится, но нужно убрать в живом поиске еще. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 15 апреля, 2016 Жалоба Поделиться Опубликовано 15 апреля, 2016 Тогда в 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: Код не проверял Цитата Ссылка на сообщение Поделиться на другие сайты
KostyanBr Опубликовано 15 апреля, 2016 Жалоба Поделиться Опубликовано 15 апреля, 2016 Тогда в ajax/search_products.php заменить запрос к БД на код: Спасибо. Все отлично работает. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 16 апреля, 2016 Жалоба Поделиться Опубликовано 16 апреля, 2016 Тогда в 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 этой темы... Цитата Ссылка на сообщение Поделиться на другие сайты
Marik35 Опубликовано 19 марта, 2018 Жалоба Поделиться Опубликовано 19 марта, 2018 не проверял но примерно так: 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) работает, а как это же условие задать для двух категорий? Цитата Ссылка на сообщение Поделиться на другие сайты
Решение yr4ik Опубликовано 20 марта, 2018 Решение Жалоба Поделиться Опубликовано 20 марта, 2018 Друзья, с одной категорией (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); } Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.