«Новые поступления» и «Лидеры продаж» не выводить товаровыз без категории.

Тема в разделе "OpenCart", создана пользователем kolich85, 26 дек 2013.

  1. kolich85

    kolich85

    Регистрация:
    19 сен 2013
    Сообщения:
    162
    Симпатии:
    84
    Добрый день!
    Подскажите пожалуйста как сделать так что б в модулях «Новые поступления» и «Лидеры продаж» выводились товары только из определенных категорий или же проще не выводить товар который не относиться ни к какой категории?
     
  2. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    123
    Симпатии:
    15
    меня тоже интересует. Есть частично тут. Но на Лидеры продаж не работает. Видел модуль за 300 рулб. Кстати буду признателен если у кого то есть.
     
  3. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    123
    Симпатии:
    15
    Получилось для OpenCart 1.5.1.3. Криво правда, но работает.

    И так для «Новые поступления»
    catalog/controller/module/latest.php
    перед
    Код:
    protected function index($setting) {
    добавляем
    Код:
    private function _endc( $array ) { return end( $array ); }
    потом, перед
    Код:
    $results = $this->model_catalog_product->getProducts($data);
    вставляем:
    Код:
    if ((isset($this->request->get['route'])) AND ($this->request->get['route'] == 'product/category'))
    {
    $category_id = $this->_endc(explode('_', (string)$this->request->get['path']));
    $data['filter_category_id'] = $category_id;
    $data['filter_sub_category'] = TRUE;
    }
    Для «Лидеры продаж»

    catalog/model/catalog/product.php
    Полностью заменить public function getBestSellerProducts($limit) {...}
    На
    Код:
        public function getBestSellerProducts($limit) {
            $result = '';
            $parts = explode('_', (string)$this->request->get['path']);
            $sss = end($parts);
          
          
            $product_data = $this->cache->get('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' .  (int)$limit . '.' . $sss);
          
            if (!$product_data) {
                $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_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p2c.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2c.category_id = $sss AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int)$limit);
    
                foreach ($query->rows as $result) {
                    $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
                }
              
    
                if (!$result) {
                    $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_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p2c.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);
    
                    foreach ($query->rows as $result) {
                        $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
                    }
                }
    
                $this->cache->set('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$limit . '.' . $sss, $product_data);
            }
          
            return $product_data;
        }

    Уверен что сделано не ровно, но работает. Если кто поможет оптимизировать, сделать код лучше, буду рад.

    исправил то, что не правильно написал выше. МОДЕРАТОР исправьте, у меня такой возможности нет. что касается «Новые поступления» все по прежнему. переделал «Лидеры продаж»:

    catalog/controller/module/bestseller.php
    перед
    Код:
    protected function index($setting) {
    вставить
    Код:
    private function _endc( $array ) { return end( $array ); }
    строку
    Код:
    $results = $this->model_catalog_product->getBestSellerProducts($setting['limit']);
    заменить на
    Код:
            $data = array(
                'limit' => $setting['limit'],
            );
          
            if ((isset($this->request->get['route'])) AND ($this->request->get['route'] == 'product/category') OR ($this->request->get['route'] == 'product/product'))
                {
                    $category_id = $this->_endc(explode('_', (string)$this->request->get['path']));     
                    $data['filter_category_id'] = $category_id;
                    $data['filter_sub_category'] = TRUE;
                }
    
            $results = $this->model_catalog_product->getBestSellerProducts($data);
    catalog/model/catalog/product.php
    Полностью заменить public function getBestSellerProducts($limit) {...}
    На
    Код:
        public function getBestSellerProducts($data = array()) {
          
            $product_data = $this->cache->get('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$data['limit'] . '.' . $data['filter_category_id']);
          
            if (!$product_data) {
          
                $sql = "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_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p2c.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW()";
              
                if (!empty($data['filter_category_id'])) {
                    if (!empty($data['filter_sub_category'])) {
                        $implode_data = array();
                        $implode_data[] = "p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
                        $this->load->model('catalog/category');
                        $categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
                        foreach ($categories as $category_id) {
                            $implode_data[] = "p2c.category_id = '" . (int)$category_id . "'";
                        }
                        $sql .= " AND (" . implode(' OR ', $implode_data) . ")";          
                    } else {
                        $sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
                    }
                }
    
                $sql .= " AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int)$data['limit'];
              
                $query = $this->db->query($sql);
              
                foreach ($query->rows as $result) {
                    $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
                }
              
                $this->cache->set('product.bestseller.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$data['limit'] . '.' . $data['filter_category_id'], $product_data);
            }
          
            return $product_data;
        }

    Вроде так. Точно работает на странице товара и категории. Не уверен на счет прочих, но дописать можно.
     
    Lasted edited by : 22 мар 2014
    kolich85 нравится это.