Filter Products by Category in Opencart

Asked

Viewed 147 times

2

I have a code in Opencart, it randomly displays the products from the store. I would like to modify this code to display the products of a specific category through id or in the best way.

The original code where I believe the modification can be made, is in the controller folder, follows the code:

$data['products'] = array();

$filter_data = array(
    'sort'  => 'p.date_added',
    'order' => 'DESC',
    'start' => 0,
    'limit' => $setting['limit']
);

$results = $this->model_catalog_random->getRandomProducts($filter_data);

I modified the code and put it like this, but it didn’t work:

$data['products'] = array();

$filter_data = array(
    'filter_category_id'  => '63',
    'sort'  => 'p.date_added',
    'order' => 'DESC',
    'start' => 0,
    'limit' => $setting['limit']
);

$results = $this->model_catalog_random->getRandomProducts($filter_data);

Follow all query code:

class ModelCatalogRandom extends Model {

public function getProduct($product_id) {
    if ($this->customer->isLogged()) {
        $customer_group_id = $this->customer->getGroupId();
    } else {
        $customer_group_id = $this->config->get('config_customer_group_id');
    }   

    $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') . "'");

    if ($query->num_rows) {
        return array(
            'product_id'       => $query->row['product_id'],
            'name'             => $query->row['name'],
            'description'      => $query->row['description'],
            'meta_description' => $query->row['meta_description'],
            'meta_keyword'     => $query->row['meta_keyword'],
            'tag'              => $query->row['tag'],
            'model'            => $query->row['model'],
            'sku'              => $query->row['sku'],
            'upc'              => $query->row['upc'],
            'ean'              => $query->row['ean'],
            'jan'              => $query->row['jan'],
            'isbn'             => $query->row['isbn'],
            'mpn'              => $query->row['mpn'],
            'location'         => $query->row['location'],
            'quantity'         => $query->row['quantity'],
            'stock_status'     => $query->row['stock_status'],
            'image'            => $query->row['image'],
            'manufacturer_id'  => $query->row['manufacturer_id'],
            'manufacturer'     => $query->row['manufacturer'],
            'price'            => ($query->row['discount'] ? $query->row['discount'] : $query->row['price']),
            'special'          => $query->row['special'],
            'reward'           => $query->row['reward'],
            'points'           => $query->row['points'],
            'tax_class_id'     => $query->row['tax_class_id'],
            'date_available'   => $query->row['date_available'],
            'weight'           => $query->row['weight'],
            'weight_class_id'  => $query->row['weight_class_id'],
            'length'           => $query->row['length'],
            'width'            => $query->row['width'],
            'height'           => $query->row['height'],
            'length_class_id'  => $query->row['length_class_id'],
            'subtract'         => $query->row['subtract'],
            'rating'           => round($query->row['rating']),
            'reviews'          => $query->row['reviews'] ? $query->row['reviews'] : 0,
            'minimum'          => $query->row['minimum'],
            'sort_order'       => $query->row['sort_order'],
            'status'           => $query->row['status'],
            'date_added'       => $query->row['date_added'],
            'date_modified'    => $query->row['date_modified'],
            'viewed'           => $query->row['viewed']
        );
    } else {
        return false;
    }
}

public function getRandomProducts($data = array()) {
    if ($this->customer->isLogged()) {
        $customer_group_id = $this->customer->getGroupId();
    } else {
        $customer_group_id = $this->config->get('config_customer_group_id');
    }   

    $cache = md5(http_build_query($data));

    $product_data = $this->cache->get('product.' . $cache . '.' . $customer_group_id);

    //if (!$product_data) {
        $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) 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') . "'"; 

        $sql .= " GROUP BY p.product_id";

        $sort_data = array(             'pd.name',
            'p.model',
            'p.quantity',
            'p.price',
            'rating',
            'p.sort_order',
            'p.date_added'
        );  

        $sql .= " ORDER BY Rand()";

        if (isset($data['order']) && ($data['order'] == 'DESC')) {
            $sql .= " DESC";
        } else {
            $sql .= " ASC";
        }

        if (isset($data['start']) || isset($data['limit'])) {
            if ($data['start'] < 0) {
                $data['start'] = 0;
            }               

            if ($data['limit'] < 1) {
                $data['limit'] = 20;
            }   

            $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
        }

        $product_data = array();    
        $query = $this->db->query($sql);

        foreach ($query->rows as $result) {
            $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
        }

        $this->cache->set('product.' . $cache . '.' . $customer_group_id, $product_data);
    //}

    return $product_data;
}
  • Where’s the query? What didn’t work?

  • @Marconi I entered all the query code, it did not work to display only the category products with id 77.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.