esistema1 Опубликовано 6 октября, 2020 Жалоба Поделиться Опубликовано 6 октября, 2020 (изменено) Всем доброго дня! Делаю на сайте вывод всех брендов на одной странице по инструкции 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(); } Изменено 6 октября, 2020 пользователем esistema1 Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 6 октября, 2020 Жалоба Поделиться Опубликовано 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'); } } Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 6 октября, 2020 Автор Жалоба Поделиться Опубликовано 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'); } } Так все равно показываются все бренды... Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 6 октября, 2020 Жалоба Поделиться Опубликовано 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)); Это вызов Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 6 октября, 2020 Автор Жалоба Поделиться Опубликовано 6 октября, 2020 (изменено) Все равно показывает все бренды... Изменено 6 октября, 2020 пользователем esistema1 Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 6 октября, 2020 Жалоба Поделиться Опубликовано 6 октября, 2020 Поменяйте вот этот кусок $this->db->query($query); return $this->db->results(); На вот такой $this->db->query($query); print_r($query); return $this->db->results(); И посмотрите, что выведется, какой будет запрос Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 6 октября, 2020 Жалоба Поделиться Опубликовано 6 октября, 2020 37 минут назад, esistema1 сказал: Все равно показывает все бренды... Оно и будет всегда показывать именно ВСЕ бренды. Вообще функция совсем негодящая. 1. запрос в функции так составлен, что в принципе ВСЕГДА будет давать ВСЕ бренды, хоть с фильтрами 'in_stock'=>1,'visible'=>1, хоть без них. 2. фильтр 'visible'=>1 тоже в принципе работать верно не будет, так как в запросе вообще не участвует поле p.visible. 3. В итоговый запрос зачем-то ДВАЖДЫ вставляется $visible_filter. Недостаток мелкий, но говорит сам за себя... Функцию надо переделывать почти полностью... Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 6 октября, 2020 Жалоба Поделиться Опубликовано 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(); } Вот так работать должно, но без фильтра по категориям Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 6 октября, 2020 Жалоба Поделиться Опубликовано 6 октября, 2020 2 часа назад, Kosjak76 сказал: Вот так работать должно, но без фильтра по категориям Одно решение лучше другого Так держать! Цитата Ссылка на сообщение Поделиться на другие сайты
esistema1 Опубликовано 7 октября, 2020 Автор Жалоба Поделиться Опубликовано 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(); } Вот так работать должно, но без фильтра по категориям Вот так работает! Спасибо огромное! Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.