esistema1 Posted October 6, 2020 Report Share Posted October 6, 2020 (edited) Всем доброго дня! Делаю на сайте вывод всех брендов на одной странице по инструкции https://forum.simplacms.ru/topic/815-отдельная-страница-всех-брендов/ Все прикрутил, работает. Но как сделать так чтобы на странице /brands показывались только те бренды в которых есть товары с кол-вом больше 0 (т.е. чтобы срабатывал фильтр in_stock) Вот сама функция (подскажите пожалуйста что в ней надо исправить): public function get_all_brands($filter = array()) { $category_id_filter = ''; $visible_filter = ''; $in_stock_filter = ''; if(isset($filter['in_stock'])) $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock'])); if(isset($filter['visible'])) $visible_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ? ' , intval($filter['visible'])); if(!empty($filter['category_id'])) $category_id_filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id LEFT JOIN __products_categories pc ON p.id = pc.product_id WHERE pc.category_id in(?@) $visible_filter $in_stock_filter", (array)$filter['category_id']); // Выбираем все бренды $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image FROM __brands b $category_id_filter $visible_filter ORDER BY b.name"); $this->db->query($query); return $this->db->results(); } Edited October 6, 2020 by esistema1 Quote Link to post Share on other sites
Kosjak76 Posted October 6, 2020 Report Share Posted October 6, 2020 В функции ничего менять не надо, надо просто ее вызвать с правильным фильтром Примерно так <?PHP require_once('View.php'); class BrandsView extends View { function fetch() { // Выбираем товар из базы $this->design->assign('meta_title', 'Все производители'); $this->design->assign('meta_keywords', 'Все производители'); $this->design->assign('meta_description', 'Все производители'); $brands = $this->brands->get_brands(array('in_stock'=>1,'visible'=>1)); $this->design->assign('brands', $brands); return $this->design->fetch('brands.tpl'); } } Quote Link to post Share on other sites
esistema1 Posted October 6, 2020 Author Report Share Posted October 6, 2020 5 минут назад, Kosjak76 сказал: В функции ничего менять не надо, надо просто ее вызвать с правильным фильтром Примерно так <?PHP require_once('View.php'); class BrandsView extends View { function fetch() { // Выбираем товар из базы $this->design->assign('meta_title', 'Все производители'); $this->design->assign('meta_keywords', 'Все производители'); $this->design->assign('meta_description', 'Все производители'); $brands = $this->brands->get_brands(array('in_stock'=>1,'visible'=>1)); $this->design->assign('brands', $brands); return $this->design->fetch('brands.tpl'); } } Так все равно показываются все бренды... Quote Link to post Share on other sites
Kosjak76 Posted October 6, 2020 Report Share Posted October 6, 2020 Да, там же нет категории Тогда по-другому public function get_all_brands($filter = array()) { $category_id_filter = ''; $visible_filter = ''; $in_stock_filter = ''; if(isset($filter['in_stock'])) $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock'])); if(isset($filter['visible'])) $visible_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ? ' , intval($filter['visible'])); $category_id_filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id $visible_filter $in_stock_filter", (array)$filter['category_id']); // Выбираем все бренды $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image FROM __brands b $category_id_filter $visible_filter ORDER BY b.name"); $this->db->query($query); return $this->db->results(); } Это функция $brands = $this->brands->get_all_brands(array('in_stock'=>1,'visible'=>1)); Это вызов Quote Link to post Share on other sites
esistema1 Posted October 6, 2020 Author Report Share Posted October 6, 2020 (edited) Все равно показывает все бренды... Edited October 6, 2020 by esistema1 Quote Link to post Share on other sites
Kosjak76 Posted October 6, 2020 Report Share Posted October 6, 2020 Поменяйте вот этот кусок $this->db->query($query); return $this->db->results(); На вот такой $this->db->query($query); print_r($query); return $this->db->results(); И посмотрите, что выведется, какой будет запрос Quote Link to post Share on other sites
phukortsin Posted October 6, 2020 Report Share Posted October 6, 2020 37 минут назад, esistema1 сказал: Все равно показывает все бренды... Оно и будет всегда показывать именно ВСЕ бренды. Вообще функция совсем негодящая. 1. запрос в функции так составлен, что в принципе ВСЕГДА будет давать ВСЕ бренды, хоть с фильтрами 'in_stock'=>1,'visible'=>1, хоть без них. 2. фильтр 'visible'=>1 тоже в принципе работать верно не будет, так как в запросе вообще не участвует поле p.visible. 3. В итоговый запрос зачем-то ДВАЖДЫ вставляется $visible_filter. Недостаток мелкий, но говорит сам за себя... Функцию надо переделывать почти полностью... Quote Link to post Share on other sites
Kosjak76 Posted October 6, 2020 Report Share Posted October 6, 2020 Не увидел, что функцию исковеркали через жопу public function get_all_brands($filter = array()) { $visible_filter = ''; $in_stock_filter = ''; if(isset($filter['in_stock'])) $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock'])); if(isset($filter['visible'])) $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible'])); $filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id WHERE 1 $visible_filter $in_stock_filter"); // Выбираем все бренды $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image FROM __brands b $filter ORDER BY b.name"); $this->db->query($query); return $this->db->results(); } Вот так работать должно, но без фильтра по категориям Quote Link to post Share on other sites
Noxter Posted October 6, 2020 Report Share Posted October 6, 2020 2 часа назад, Kosjak76 сказал: Вот так работать должно, но без фильтра по категориям Одно решение лучше другого Так держать! Quote Link to post Share on other sites
esistema1 Posted October 7, 2020 Author Report Share Posted October 7, 2020 11 часов назад, Kosjak76 сказал: Не увидел, что функцию исковеркали через жопу public function get_all_brands($filter = array()) { $visible_filter = ''; $in_stock_filter = ''; if(isset($filter['in_stock'])) $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock'])); if(isset($filter['visible'])) $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible'])); $filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id WHERE 1 $visible_filter $in_stock_filter"); // Выбираем все бренды $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image FROM __brands b $filter ORDER BY b.name"); $this->db->query($query); return $this->db->results(); } Вот так работать должно, но без фильтра по категориям Вот так работает! Спасибо огромное! Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.