Vlupidol Опубликовано 29 марта, 2017 Жалоба Поделиться Опубликовано 29 марта, 2017 Здравствуйте.Стоит не стандартный фильтр, но после установки сразу-же заметил проблему.. Проблема в том, что например при запросе{get_new_products var=new_products limit=10}выводит всего 8 товаров! Причину найти никак не могу, помогите пожалуйста.Функции из api/Products.php - get_products и count_products (проблема выявлена именно в них т.к. замена этих функций на стандартные решает проблему) public function get_products($filter = array()) { // По умолчанию $limit = 100; $page = 1; $category_id_filter = ''; $brand_id_filter = ''; $product_id_filter = ''; $features_filter = ''; $keyword_filter = ''; $visible_filter = ''; $min_price = ''; $max_price = ''; $is_featured_filter = ''; $discounted_filter = ''; $in_stock_filter = ''; $group_by = ''; $order = 'p.position DESC'; if(isset($filter['limit'])) $limit = max(1, intval($filter['limit'])); if(isset($filter['page'])) $page = max(1, intval($filter['page'])); $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit); if(!empty($filter['category_id'])) { $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']); $group_by = "GROUP BY p.id"; } if(!empty($filter['brand_id'])) $brand_id_filter = $this->db->placehold('AND p.brand_id in(?@)', (array)$filter['brand_id']); if(!empty($filter['id'])) $product_id_filter = $this->db->placehold('AND p.id in(?@)', (array)$filter['id']); if(!empty($filter['features']) && !empty($filter['features'])) foreach($filter['features'] as $feature=>$value) $features_filter .= $this->db->placehold('AND p.id in (SELECT product_id FROM __options WHERE feature_id=? AND value in (?@) ) ', $feature, $value); if(!empty($filter['keyword'])) { $keywords = explode(' ', $filter['keyword']); foreach($keywords as $keyword) { $kw = $this->db->escape(trim($keyword)); if($kw!=='') $keyword_filter .= $this->db->placehold("AND (p.name LIKE '%$kw%' OR p.meta_keywords LIKE '%$kw%' OR p.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%'))"); } } if(!empty($filter['visible'])) $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible'])); if(!empty($filter['min_price'])) $min_price = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>=? AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1)', intval($filter['min_price']));; if(!empty($filter['max_price'])) $max_price = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price<=? AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1)', intval($filter['max_price'])); if(!empty($filter['featured'])) $is_featured_filter = $this->db->placehold('AND p.featured=?', intval($filter['featured'])); if(!empty($filter['discounted'])) $discounted_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = ?', intval($filter['discounted'])); $in_stock_filter = !empty($filter['in_stock']) ? $this->db->placehold('AND v.price '.($filter['in_stock'] ? '>' : '=').' 0 '.($filter['in_stock'] ? 'AND' : 'OR').' ('.($filter['in_stock'] ? 'v.stock IS NULL OR ' : '').'v.stock '.($filter['in_stock'] ? '>' : '=').' 0)') : ''; if(!empty($filter['sort'])) switch ($filter['sort']) { case 'position': $order = 'p.position DESC'; break; case 'name': $order = 'p.name'; break; case 'created': $order = 'p.created DESC'; break; case 'price': //$order = 'pv.price IS NULL, pv.price=0, pv.price'; $order = '(SELECT -pv.price FROM __variants pv WHERE (pv.stock IS NULL OR pv.stock>0) AND p.id = pv.product_id AND pv.position=(SELECT MIN(position) FROM __variants WHERE (stock>0 OR stock IS NULL) AND product_id=p.id LIMIT 1) LIMIT 1) DESC'; break; } $query = "SELECT p.id, p.url, p.brand_id, p.name, p.annotation, p.body, p.position, p.created as created, p.visible, p.featured, p.meta_title, p.meta_keywords, p.meta_description, b.name as brand, b.url as brand_url FROM __products p $category_id_filter LEFT JOIN __brands b ON p.brand_id = b.id LEFT JOIN __variants v ON v.product_id = p.id WHERE 1 $product_id_filter $brand_id_filter $features_filter $keyword_filter $is_featured_filter $discounted_filter $in_stock_filter $visible_filter $min_price $max_price $group_by ORDER BY $order $sql_limit"; $query = $this->db->placehold($query); $this->db->query($query); return $this->db->results(); } public function count_products($filter = array()) { $category_id_filter = ''; $brand_id_filter = ''; $product_id_filter = ''; $keyword_filter = ''; $visible_filter = ''; $min_price = ''; $max_price = ''; $is_featured_filter = ''; $discounted_filter = ''; $features_filter = ''; $in_stock_filter = ''; if(!empty($filter['category_id'])) { $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']); $group_by = "GROUP BY p.id"; } if(!empty($filter['brand_id'])) $brand_id_filter = $this->db->placehold('AND p.brand_id in(?@)', (array)$filter['brand_id']); if(!empty($filter['id'])) $product_id_filter = $this->db->placehold('AND p.id in(?@)', (array)$filter['id']); if(!empty($filter['keyword'])) { $keywords = explode(' ', $filter['keyword']); foreach($keywords as $keyword) { $kw = $this->db->escape(trim($keyword)); if($kw!=='') $keyword_filter .= $this->db->placehold("AND (p.name LIKE '%$kw%' OR p.meta_keywords LIKE '%$kw%' OR p.id in (SELECT product_id FROM __variants WHERE sku LIKE '%$kw%'))"); } } if(!empty($filter['visible'])) $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible'])); if(!empty($filter['min_price'])) $min_price = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>=? AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1)', intval($filter['min_price']));; if(!empty($filter['max_price'])) $max_price = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.price<=? AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1)', intval($filter['max_price'])); if(!empty($filter['featured'])) $is_featured_filter = $this->db->placehold('AND p.featured=?', intval($filter['featured'])); if(!empty($filter['discounted'])) $discounted_filter = $this->db->placehold('AND (SELECT 1 FROM __variants pv WHERE pv.product_id=p.id AND pv.compare_price>0 LIMIT 1) = ?', intval($filter['discounted'])); if(!empty($filter['features']) && !empty($filter['features'])) foreach($filter['features'] as $feature=>$value) $features_filter .= $this->db->placehold('AND p.id in (SELECT product_id FROM __options WHERE feature_id=? AND value in (?@) ) ', $feature, $value); $in_stock_filter = !empty($filter['in_stock']) ? $this->db->placehold('AND v.price '.($filter['in_stock'] ? '>' : '=').' 0 '.($filter['in_stock'] ? 'AND' : 'OR').' ('.($filter['in_stock'] ? 'v.stock IS NULL OR ' : '').'v.stock '.($filter['in_stock'] ? '>' : '=').' 0)') : ''; $query = "SELECT count(distinct p.id) as count FROM __products AS p LEFT JOIN __variants v on v.product_id = p.id $category_id_filter WHERE 1 $brand_id_filter $product_id_filter $keyword_filter $visible_filter $min_price $max_price $is_featured_filter $discounted_filter $features_filter $in_stock_filter "; $this->db->query($query); return $this->db->result('count'); } Цитата Ссылка на сообщение Поделиться на другие сайты
ahmed Опубликовано 30 марта, 2017 Жалоба Поделиться Опубликовано 30 марта, 2017 Скорее всего, причина в принципиальных ошибках разработчика Вашего фильтра. Требуйте исправлений.Очень подозрительно выглядит, например, добавка в запросеLEFT JOIN __variants v ON v.product_id = p.idЭто может, к тому же, нарушать правильный вывод списка товаров в админке.А чтобы точно узнать причины, надо анализировать генерируемые SQL-запросы. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.