public function getProducts($data = array()) { $language_id = (int)$this->config->get('config_language_id'); $store_id = (int)$this->config->get('config_store_id'); // Кеш для списку product_id по фільтрах (категорія, сортування, сторінка) $key_data = $data; ksort($key_data); $cache_key = 'products.list.' . md5(serialize($key_data)); $product_ids = $this->cache->get($cache_key); if ($product_ids !== false && $product_ids !== null) { $product_data = array(); foreach ($product_ids as $product_id) { $product_data[$product_id] = $this->getProduct($product_id); } return $product_data; } // 1) Базовий SELECT — тільки product_id $sql = "SELECT SQL_CACHE DISTINCT p.product_id"; // 2) FROM + JOIN-и по категоріях / фільтрах if (!empty($data['filter_category_id'])) { if (!empty($data['filter_sub_category'])) { // з підкатегоріями $sql .= " FROM " . DB_PREFIX . "category_path cp LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (cp.category_id = p2c.category_id)"; } else { // тільки конкретна категорія $sql .= " FROM " . DB_PREFIX . "product_to_category p2c"; } if (!empty($data['filter_filter'])) { $sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (pf.product_id = p.product_id)"; } else { $sql .= " LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)"; } } else { // без категорії $sql .= " FROM " . DB_PREFIX . "product p"; } // JOIN з описом — для тегів і на всяк випадок $sql .= " LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id AND pd.language_id = '" . $language_id . "')"; // Магазин $sql .= " LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)"; // 3) WHERE $where = array(); // Стандартні фільтри опенкарта $where[] = "p.status = '1'"; $where[] = "p.date_available <= NOW()"; $where[] = "p2s.store_id = '" . $store_id . "'"; // Наше головне обмеження: показуємо тільки майбутні події $where[] = "p.EventDate > NOW()"; // Категорія / підкатегорії if (!empty($data['filter_category_id'])) { if (!empty($data['filter_sub_category'])) { $where[] = "cp.path_id = '" . (int)$data['filter_category_id'] . "'"; } else { $where[] = "p2c.category_id = '" . (int)$data['filter_category_id'] . "'"; } // Фільтри товару if (!empty($data['filter_filter'])) { $filters = array(); $parts = explode(',', $data['filter_filter']); foreach ($parts as $filter_id) { $filters[] = (int)$filter_id; } if ($filters) { $where[] = "pf.filter_id IN (" . implode(',', $filters) . ")"; } } } // Пошук по назві / активності / технічним полям if (!empty($data['filter_name']) || !empty($data['filter_tag'])) { $searchParts = array(); if (!empty($data['filter_name'])) { $raw_name = trim($data['filter_name']); $esc_name = $this->db->escape($raw_name); $byName = array(); // Назви події/активності $byName[] = "p.EventName LIKE '%" . $esc_name . "%'"; $byName[] = "p.ActivityName LIKE '%" . $esc_name . "%'"; // Точні збіги по model/SKU/тощо $byName[] = "p.model = '" . $esc_name . "'"; $byName[] = "p.sku = '" . $esc_name . "'"; $byName[] = "p.upc = '" . $esc_name . "'"; $byName[] = "p.ean = '" . $esc_name . "'"; $byName[] = "p.jan = '" . $esc_name . "'"; $byName[] = "p.isbn = '" . $esc_name . "'"; $byName[] = "p.mpn = '" . $esc_name . "'"; $searchParts[] = '(' . implode(' OR ', $byName) . ')'; } // Пошук по тегах if (!empty($data['filter_tag'])) { $raw_tag = trim($data['filter_tag']); $words = explode(' ', preg_replace('/\s+/', ' ', $raw_tag)); $tagConds = array(); foreach ($words as $word) { if ($word === '') continue; $tagConds[] = "pd.tag LIKE '%" . $this->db->escape($word) . "%'"; } if ($tagConds) { $searchParts[] = '(' . implode(' AND ', $tagConds) . ')'; } } if ($searchParts) { $where[] = '(' . implode(' OR ', $searchParts) . ')'; } } // Виробник (якщо раптом використовується) if (!empty($data['filter_manufacturer_id'])) { $where[] = "p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'"; } // Збираємо WHERE if ($where) { $sql .= " WHERE " . implode(' AND ', $where); } // 4) СОРТУВАННЯ $sort_data = array( 'p.EventDate', 'p.quantity', 'p.price', 'p.sort_order' ); if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { $sql .= " ORDER BY " . $data['sort']; } else { // За замовчуванням — по даті події $sql .= " ORDER BY p.EventDate"; } if (isset($data['order']) && ($data['order'] == 'DESC')) { $sql .= " DESC"; } else { $sql .= " ASC"; } // 5) ЛІМІТ if (isset($data['start']) || isset($data['limit'])) { if (!isset($data['start']) || $data['start'] < 0) { $data['start'] = 0; } if (!isset($data['limit']) || $data['limit'] < 1) { $data['limit'] = 20; } $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit']; } // 6) Виконання $product_data = array(); $product_ids = array(); $query = $this->db->query($sql); foreach ($query->rows as $result) { $product_ids[] = (int)$result['product_id']; $product_data[$result['product_id']] = $this->getProduct($result['product_id']); } // зберігаємо список ID в кеші $this->cache->set($cache_key, $product_ids); return $product_data; } Notice: Undefined property: Proxy::getProduct in /home/admin/web/kasa.com.ua/public_html/system/storage/modification/system/engine/action.php on line 79