PageRenderTime 108ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/catalog/model/catalog/product.php

https://bitbucket.org/monobasic/shop.volero.ch
PHP | 542 lines | 395 code | 126 blank | 21 comment | 92 complexity | 469e40ec0d5bafc2957fbe1efd68a802 MD5 | raw file
  1. <?php
  2. /*
  3. * simonfilters - 2.3.1 Build 0004
  4. */
  5. class ModelCatalogProduct extends Model {
  6. public function updateViewed($product_id) {
  7. $this->db->query("UPDATE " . DB_PREFIX . "product SET viewed = (viewed + 1) WHERE product_id = '" . (int)$product_id . "'");
  8. }
  9. public function getProduct($product_id) {
  10. if ($this->customer->isLogged()) {
  11. $customer_group_id = $this->customer->getCustomerGroupId();
  12. } else {
  13. $customer_group_id = $this->config->get('config_customer_group_id');
  14. }
  15. $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
  16. if ($query->num_rows) {
  17. $query->row['price'] = ($query->row['discount'] ? $query->row['discount'] : $query->row['price']);
  18. $query->row['rating'] = (int)$query->row['rating'];
  19. return $query->row;
  20. } else {
  21. return false;
  22. }
  23. }
  24. public function getProducts($data = array()) {
  25. if ($this->customer->isLogged()) {
  26. $customer_group_id = $this->customer->getCustomerGroupId();
  27. } else {
  28. $customer_group_id = $this->config->get('config_customer_group_id');
  29. }
  30. /*
  31. * SimonFilters Code START
  32. */
  33. $this->load->model('catalog/filter');
  34. $data['simonfilters']=$this->model_catalog_filter->getSimonAttributesCacheData();
  35. /*
  36. * SimonFilters Code END
  37. */
  38. $cache = md5(http_build_query($data));
  39. $product_data = $this->cache->get('product.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
  40. if (!$product_data) {
  41. $this->model_catalog_filter->debug(__FILE__.';'.__LINE__,'Cache created or missed');
  42. $sql = "SELECT p.product_id, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";
  43. if (!empty($data['filter_tag'])) {
  44. $sql .= " LEFT JOIN " . DB_PREFIX . "product_tag pt ON (p.product_id = pt.product_id)";
  45. }
  46. if (!empty($data['filter_category_id'])) {
  47. $sql .= " LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)";
  48. }
  49. $sql .= " WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
  50. if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
  51. $sql .= " AND (";
  52. if (!empty($data['filter_name'])) {
  53. $implode = array();
  54. $words = explode(' ', $data['filter_name']);
  55. foreach ($words as $word) {
  56. if (!empty($data['filter_description'])) {
  57. $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
  58. } else {
  59. $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
  60. }
  61. }
  62. if ($implode) {
  63. $sql .= " " . implode(" OR ", $implode) . "";
  64. }
  65. }
  66. if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
  67. $sql .= " OR ";
  68. }
  69. if (!empty($data['filter_tag'])) {
  70. $implode = array();
  71. $words = explode(' ', $data['filter_tag']);
  72. foreach ($words as $word) {
  73. $implode[] = "LCASE(pt.tag) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_tag'])) . "%' AND pt.language_id = '" . (int)$this->config->get('config_language_id') . "'";
  74. }
  75. if ($implode) {
  76. $sql .= " " . implode(" OR ", $implode) . "";
  77. }
  78. }
  79. $sql .= ")";
  80. }
  81. if (!empty($data['filter_category_id'])) {
  82. if (!empty($data['filter_sub_category'])) {
  83. $implode_data = array();
  84. $implode_data[] = "p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
  85. $this->load->model('catalog/category');
  86. $categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
  87. foreach ($categories as $category_id) {
  88. $implode_data[] = "p2c.category_id = '" . (int)$category_id . "'";
  89. }
  90. $sql .= " AND (" . implode(' OR ', $implode_data) . ")";
  91. } else {
  92. $sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
  93. }
  94. }
  95. if (!empty($data['filter_manufacturer_id'])) {
  96. $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
  97. }
  98. /*
  99. * SimonFilters Code START
  100. */
  101. $sql .= $this->model_catalog_filter->getSimonAttributes();
  102. /*
  103. * SimonFilters Code END
  104. */
  105. $sql .= " GROUP BY p.product_id";
  106. $this->model_catalog_filter->debug(__FILE__.';'.__LINE__,'sql',$sql);
  107. $sort_data = array(
  108. 'pd.name',
  109. 'p.model',
  110. 'p.quantity',
  111. 'p.price',
  112. 'rating',
  113. 'p.sort_order',
  114. 'p.date_added'
  115. );
  116. if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
  117. if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
  118. $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
  119. } else {
  120. $sql .= " ORDER BY " . $data['sort'];
  121. }
  122. } else {
  123. $sql .= " ORDER BY p.sort_order";
  124. }
  125. if (isset($data['order']) && ($data['order'] == 'DESC')) {
  126. $sql .= " DESC";
  127. } else {
  128. $sql .= " ASC";
  129. }
  130. if (isset($data['start']) || isset($data['limit'])) {
  131. if ($data['start'] < 0) {
  132. $data['start'] = 0;
  133. }
  134. if ($data['limit'] < 1) {
  135. $data['limit'] = 20;
  136. }
  137. $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
  138. }
  139. $product_data = array();
  140. $query = $this->db->query($sql);
  141. foreach ($query->rows as $result) {
  142. $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
  143. }
  144. $this->cache->set('product.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache, $product_data);
  145. }
  146. return $product_data;
  147. }
  148. public function getProductSpecials($data = array()) {
  149. if ($this->customer->isLogged()) {
  150. $customer_group_id = $this->customer->getCustomerGroupId();
  151. } else {
  152. $customer_group_id = $this->config->get('config_customer_group_id');
  153. }
  154. $sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) GROUP BY ps.product_id";
  155. $sort_data = array(
  156. 'pd.name',
  157. 'p.model',
  158. 'ps.price',
  159. 'rating',
  160. 'p.sort_order'
  161. );
  162. if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
  163. if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
  164. $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
  165. } else {
  166. $sql .= " ORDER BY " . $data['sort'];
  167. }
  168. } else {
  169. $sql .= " ORDER BY p.sort_order";
  170. }
  171. if (isset($data['order']) && ($data['order'] == 'DESC')) {
  172. $sql .= " DESC";
  173. } else {
  174. $sql .= " ASC";
  175. }
  176. if (isset($data['start']) || isset($data['limit'])) {
  177. if ($data['start'] < 0) {
  178. $data['start'] = 0;
  179. }
  180. if ($data['limit'] < 1) {
  181. $data['limit'] = 20;
  182. }
  183. $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
  184. }
  185. $product_data = array();
  186. $query = $this->db->query($sql);
  187. foreach ($query->rows as $result) {
  188. $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
  189. }
  190. return $product_data;
  191. }
  192. public function getLatestProducts($limit) {
  193. $product_data = $this->cache->get('product.latest.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$limit);
  194. if (!$product_data) {
  195. $query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY p.date_added DESC LIMIT " . (int)$limit);
  196. foreach ($query->rows as $result) {
  197. $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
  198. }
  199. $this->cache->set('product.latest.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$limit, $product_data);
  200. }
  201. return $product_data;
  202. }
  203. public function getPopularProducts($limit) {
  204. $product_data = array();
  205. $query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY p.viewed, p.date_added DESC LIMIT " . (int)$limit);
  206. foreach ($query->rows as $result) {
  207. $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
  208. }
  209. return $product_data;
  210. }
  211. public function getBestSellerProducts($limit) {
  212. $product_data = $this->cache->get('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$limit);
  213. if (!$product_data) {
  214. $product_data = array();
  215. $query = $this->db->query("SELECT op.product_id, COUNT(*) AS total FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int)$limit);
  216. foreach ($query->rows as $result) {
  217. $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
  218. }
  219. $this->cache->set('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$limit, $product_data);
  220. }
  221. return $product_data;
  222. }
  223. public function getProductAttributes($product_id) {
  224. $product_attribute_group_data = array();
  225. $product_attribute_group_query = $this->db->query("SELECT ag.attribute_group_id, agd.name FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_group ag ON (a.attribute_group_id = ag.attribute_group_id) LEFT JOIN " . DB_PREFIX . "attribute_group_description agd ON (ag.attribute_group_id = agd.attribute_group_id) WHERE pa.product_id = '" . (int)$product_id . "' AND agd.language_id = '" . (int)$this->config->get('config_language_id') . "' GROUP BY ag.attribute_group_id ORDER BY ag.sort_order, agd.name");
  226. foreach ($product_attribute_group_query->rows as $product_attribute_group) {
  227. $product_attribute_data = array();
  228. $product_attribute_query = $this->db->query("SELECT a.attribute_id, ad.name, pa.text FROM " . DB_PREFIX . "product_attribute pa LEFT JOIN " . DB_PREFIX . "attribute a ON (pa.attribute_id = a.attribute_id) LEFT JOIN " . DB_PREFIX . "attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE pa.product_id = '" . (int)$product_id . "' AND a.attribute_group_id = '" . (int)$product_attribute_group['attribute_group_id'] . "' AND ad.language_id = '" . (int)$this->config->get('config_language_id') . "' AND pa.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY a.sort_order, ad.name");
  229. foreach ($product_attribute_query->rows as $product_attribute) {
  230. $product_attribute_data[] = array(
  231. 'attribute_id' => $product_attribute['attribute_id'],
  232. 'name' => $product_attribute['name'],
  233. 'text' => $product_attribute['text']
  234. );
  235. }
  236. $product_attribute_group_data[] = array(
  237. 'attribute_group_id' => $product_attribute_group['attribute_group_id'],
  238. 'name' => $product_attribute_group['name'],
  239. 'attribute' => $product_attribute_data
  240. );
  241. }
  242. return $product_attribute_group_data;
  243. }
  244. public function getProductOptions($product_id) {
  245. $product_option_data = array();
  246. $product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option po LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id) WHERE po.product_id = '" . (int)$product_id . "' AND od.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY o.sort_order");
  247. foreach ($product_option_query->rows as $product_option) {
  248. if ($product_option['type'] == 'select' || $product_option['type'] == 'radio' || $product_option['type'] == 'checkbox' || $product_option['type'] == 'image') {
  249. $product_option_value_data = array();
  250. $product_option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_id = '" . (int)$product_id . "' AND pov.product_option_id = '" . (int)$product_option['product_option_id'] . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY ov.sort_order");
  251. foreach ($product_option_value_query->rows as $product_option_value) {
  252. $product_option_value_data[] = array(
  253. 'product_option_value_id' => $product_option_value['product_option_value_id'],
  254. 'option_value_id' => $product_option_value['option_value_id'],
  255. 'name' => $product_option_value['name'],
  256. 'image' => $product_option_value['image'],
  257. 'quantity' => $product_option_value['quantity'],
  258. 'subtract' => $product_option_value['subtract'],
  259. 'price' => $product_option_value['price'],
  260. 'price_prefix' => $product_option_value['price_prefix'],
  261. 'weight' => $product_option_value['weight'],
  262. 'weight_prefix' => $product_option_value['weight_prefix']
  263. );
  264. }
  265. $product_option_data[] = array(
  266. 'product_option_id' => $product_option['product_option_id'],
  267. 'option_id' => $product_option['option_id'],
  268. 'name' => $product_option['name'],
  269. 'type' => $product_option['type'],
  270. 'option_value' => $product_option_value_data,
  271. 'required' => $product_option['required']
  272. );
  273. } else {
  274. $product_option_data[] = array(
  275. 'product_option_id' => $product_option['product_option_id'],
  276. 'option_id' => $product_option['option_id'],
  277. 'name' => $product_option['name'],
  278. 'type' => $product_option['type'],
  279. 'option_value' => $product_option['option_value'],
  280. 'required' => $product_option['required']
  281. );
  282. }
  283. }
  284. return $product_option_data;
  285. }
  286. public function getProductDiscounts($product_id) {
  287. if ($this->customer->isLogged()) {
  288. $customer_group_id = $this->customer->getCustomerGroupId();
  289. } else {
  290. $customer_group_id = $this->config->get('config_customer_group_id');
  291. }
  292. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity > 1 AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity ASC, priority ASC, price ASC");
  293. return $query->rows;
  294. }
  295. public function getProductImagesDEFAULT($product_id) {
  296. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int)$product_id . "' ORDER BY sort_order ASC");
  297. return $query->rows;
  298. }
  299. public function getProductImages($product_id) {
  300. switch(VERSION) {
  301. case '1.5.1.3':
  302. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int)$product_id . "' ORDER BY sort_order ASC");
  303. break;
  304. default:
  305. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int)$product_id . "'");
  306. break;
  307. }
  308. return $query->rows;
  309. }
  310. public function getProductRelated($product_id) {
  311. $product_data = array();
  312. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related pr LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pr.product_id = '" . (int)$product_id . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
  313. foreach ($query->rows as $result) {
  314. $product_data[$result['related_id']] = $this->getProduct($result['related_id']);
  315. }
  316. return $product_data;
  317. }
  318. public function getProductTags($product_id) {
  319. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_tag WHERE product_id = '" . (int)$product_id . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
  320. return $query->rows;
  321. }
  322. public function getProductLayoutId($product_id) {
  323. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_layout WHERE product_id = '" . (int)$product_id . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "'");
  324. if ($query->num_rows) {
  325. return $query->row['layout_id'];
  326. } else {
  327. return $this->config->get('config_layout_product');
  328. }
  329. }
  330. public function getCategories($product_id) {
  331. $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'");
  332. return $query->rows;
  333. }
  334. public function getTotalProducts($data = array()) {
  335. $sql = "SELECT COUNT(DISTINCT p.product_id) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)";
  336. if (!empty($data['filter_category_id'])) {
  337. $sql .= " LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)";
  338. }
  339. if (!empty($data['filter_tag'])) {
  340. $sql .= " LEFT JOIN " . DB_PREFIX . "product_tag pt ON (p.product_id = pt.product_id)";
  341. }
  342. $sql .= " WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
  343. if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
  344. $sql .= " AND (";
  345. if (!empty($data['filter_name'])) {
  346. $implode = array();
  347. $words = explode(' ', $data['filter_name']);
  348. foreach ($words as $word) {
  349. if (!empty($data['filter_description'])) {
  350. $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
  351. } else {
  352. $implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
  353. }
  354. }
  355. if ($implode) {
  356. $sql .= " " . implode(" OR ", $implode) . "";
  357. }
  358. }
  359. if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
  360. $sql .= " OR ";
  361. }
  362. if (!empty($data['filter_tag'])) {
  363. $implode = array();
  364. $words = explode(' ', $data['filter_tag']);
  365. foreach ($words as $word) {
  366. $implode[] = "LCASE(pt.tag) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_tag'])) . "%' AND pt.language_id = '" . (int)$this->config->get('config_language_id') . "'";
  367. }
  368. if ($implode) {
  369. $sql .= " " . implode(" OR ", $implode) . "";
  370. }
  371. }
  372. $sql .= ")";
  373. }
  374. if (!empty($data['filter_category_id'])) {
  375. if (!empty($data['filter_sub_category'])) {
  376. $implode_data = array();
  377. $implode_data[] = "p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
  378. $this->load->model('catalog/category');
  379. $categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
  380. foreach ($categories as $category_id) {
  381. $implode_data[] = "p2c.category_id = '" . (int)$category_id . "'";
  382. }
  383. $sql .= " AND (" . implode(' OR ', $implode_data) . ")";
  384. } else {
  385. $sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
  386. }
  387. }
  388. if (!empty($data['filter_manufacturer_id'])) {
  389. $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
  390. }
  391. /*
  392. * SimonFilters Code START
  393. */
  394. $this->load->model('catalog/filter');
  395. $sql .= $this->model_catalog_filter->getSimonAttributes();
  396. /*
  397. * SimonFilters Code END
  398. */
  399. $query = $this->db->query($sql);
  400. return $query->row['total'];
  401. }
  402. public function getTotalProductSpecials() {
  403. if ($this->customer->isLogged()) {
  404. $customer_group_id = $this->customer->getCustomerGroupId();
  405. } else {
  406. $customer_group_id = $this->config->get('config_customer_group_id');
  407. }
  408. $query = $this->db->query("SELECT COUNT(DISTINCT ps.product_id) AS total FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))");
  409. if (isset($query->row['total'])) {
  410. return $query->row['total'];
  411. } else {
  412. return 0;
  413. }
  414. }
  415. }
  416. ?>