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::get_city in /home/admin/web/kasa.com.ua/public_html/system/storage/modification/system/engine/action.php on line 79