Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Получить мин и макс цену в категории


Sharapov317

Recommended Posts

Приветствую, форумчане!
Прошу помощи реализации вывода мин и макс цены товара в категории.

Решил добавить микроразметку в категорию товаров, а там как раз нужно найти и подставить эти значения.

 

Задача такая:

  1. Вывести мин и макс цену для текущей категории
  2. Цена должна быть > 0 (потому что есть товары с нулевой ценой - удалять нельзя, они периодически обновляются)
  3. Цена должна учитывать обычную цену, скидки, акции, опции (то есть самая низкая/высокая цена в любом варианте)
  4. Количество товара должно быть > 0 (то есть цена только для товаров в наличии)
  5. Запрос должен создавать минимум нагрузки на сайт

Неделю посидел...немного насидел. Синтаксис запросов почти не понимаю, хотя что то написал)
Кто может поправьте как надо.

В любом случае за отклик спасибо

 

Сейчас так:

Opencart 2.3.0.2

В catalog/model/catalog/product.php
----------
public function getMinPriceFromCategory($category_id) {
        $query = $this->db->query("SELECT LEAST(p.price,IFNULL(ps.price, p.price)) min_price FROM `" . 
        	DB_PREFIX . "category` c RIGHT JOIN `" . 
        	DB_PREFIX . "product_to_category` p2c ON p2c.category_id = c.category_id RIGHT JOIN `" . 
            DB_PREFIX . "product` p ON p2c.product_id = p.product_id LEFT JOIN `" . 
            DB_PREFIX . "product_special` ps ON p.product_id = ps.product_id AND ps.date_end >= NOW() AND ps.date_start <= NOW()
            WHERE c.category_id = " . (int)$category_id . " AND p.status = 1 AND c.status = 1 AND p.price > 0 AND p.quantity > 0
            ORDER BY min_price
            LIMIT 0,1
        ");
        
        if ($query->num_rows) {
			return $query->row['min_price'];
		} else {
			return 0;
		}
    }
	
В catalog/controller/product/category.php
----------
$data['min_price'] = $this->model_catalog_product->getMinPriceFromCategory($category_id);

В catalog/view/theme/*/template/product/category.tpl
----------
<?php echo $min_price; ?>

 

Надіслати
Поділитися на інших сайтах


Это не лучшее решение, Годится для малого количества товаров
наиболее оптимальный вариант
дополнительные поля с предварительно вычесленными значениями, и работающий таск в кроне

Надіслати
Поділитися на інших сайтах

Добавлю свое решение. 

Можно добавить в catalog/model/catalog/product.php

 

Но как и писали выше, правильнее добавить поля и пересчитывать по cron

При большом количестве товаров запрос становится довольно тяжелым.

 

Параметры

 

$data = array(
	'filter_category_id' => $category_id,
    'filter_sub_category' => true
);

$type  = "max"; // min

 

public function getMinMaxPrice($data = array(), $type)
{
    $sql_form_form = "";
    if (! empty($data['filter_category_id'])) {
        if (! empty($data['filter_sub_category'])) {
            $sql_form .= " FROM " . DB_PREFIX . "category_path cp LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (cp.category_id = p2c.category_id)";
        } else {
            $sql_form .= " FROM " . DB_PREFIX . "product_to_category p2c";
        }

        $sql_form .= " LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)";
    } else {
        $sql_form .= " FROM " . DB_PREFIX . "product p";
    }

    $sql_form .= " WHERE p.status = '1' AND p.date_available <= NOW()";
    if (! empty($data['filter_category_id'])) {
        if (! empty($data['filter_sub_category'])) {
            $sql_form .= " AND cp.path_id = '" . (int) $data['filter_category_id'] . "'";
        } else {
            $sql_form .= " AND p2c.category_id = '" . (int) $data['filter_category_id'] . "'";
        }
    }

    $sql = "";

    if ($type == "max") {
        $sql = "SELECT GREATEST( MAX(price), ( SELECT IFNULL(MAX(price),0) ";
    }

    if ($type == "min") {
        $sql = "SELECT LEAST( MIN(price), ( SELECT IFNULL(MIN(price),9999999999)";
    }

    $sql .= "FROM  oc_product_special WHERE product_id IN (SELECT p.product_id ";
    $sql .= $sql_form;
    $sql .= ") ) ) as price";

    $sql .= $sql_form;

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

    return $query->row['price'];
}

 

  • +1 2
Надіслати
Поділитися на інших сайтах

Здравствуйте @SirGrey!
Если я правильно понял, то в catalog/model/catalog/product.php:

public function getMinMaxPrice($data = array(), $type)
{...

В catalog/controller/product/category.php: 

$data = array(
	'filter...

А в шаблоне вывожу так?

<?php echo $price['max']; ?>

 

Надіслати
Поділитися на інших сайтах


В 19.03.2020 в 21:29, AlexDW сказал:

 

Я уже видел данный пример, но к сожалению не разобрался с ним.
Жаль что человек который все сделал не поделился полным решением(

Надіслати
Поділитися на інших сайтах


26 минут назад, Sharapov317 сказал:

<?php echo $price['max']; ?>

 

В контроллере

$filter_data = array(
    'filter_category_id' => $category_id,
    'filter_sub_category' => true
);

$data['price_max'] = $this->model_catalog_product->getMinMaxPrice($filter_data,'max');

 

В шаблоне 

 

<?php echo $price_max; ?>

 

  • +1 3
Надіслати
Поділитися на інших сайтах

  • 1 year later...
  • 1 year later...
25.03.2020 в 21:35, SirGrey сказал:

 

В контроллере

$filter_data = array(
    'filter_category_id' => $category_id,
    'filter_sub_category' => true
);

$data['price_max'] = $this->model_catalog_product->getMinMaxPrice($filter_data,'max');

 

В шаблоне 

 

<?php echo $price_max; ?>

 

а что делать если на сайте используется валюта?

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.