Получение опции на странице категорий

  • Автор темы Автор темы venter
  • Дата начала Дата начала
Всем привет!!!

В общем обратились с задачей такой:
У товара изначально цена 0 и она формируется от выбора опций. Нужно вывести в товаре минимальную сумму опции на странице категорий

Порывшись ради интереса в сети набрел на вот такую дич
sshot-13.png
причем много где так советуют.
Я считаю что запросы SELECT в цикле это зло, но вот опенкарт прямо пестрит ими. Допустим для вывода товаров на стр категорий в запросе и так есть цикл с запросом внутри, а тут еще добавляют вот такую шляпу.

В общем вот решение:

1. Идем в модель model/catalog/product. php, находим метод getProducts. Нужно добавить в запрос данные
в первых строках видим вот такое
php:
Развернуть Свернуть Скопировать
SELECT p.product_id, (SELECT AVG

можно после p.product_id добавить, допустим вот так чтоб было
php:
Развернуть Свернуть Скопировать
SELECT p.product_id, MIN(pov.price) AS sums, pov.product_id AS pid, (SELECT AVG

вот это pov.product_id AS pid по сути не обязательно, но может кому надо будет

2. Далее идем чуть ниже и находим вот такую строку
php:
Развернуть Свернуть Скопировать
$sql .= " LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id)";

и перед ней или после нее, я ставил перед ней, поставить вот такой доп запрос
php:
Развернуть Свернуть Скопировать
$sql .= " LEFT JOIN ".DB_PREFIX."product_option_value pov ON (pov.product_id = p.product_id)";

3. Далее опять спускаемся еще ниже до самого цикла

php:
Развернуть Свернуть Скопировать
foreach ($query->rows as $result) {

и в цикле вставляем
php:
Развернуть Свернуть Скопировать
$product_data[$result['product_id']]['min_opt'] = $result['sums'];

4. Идем в контроллер категории controller/product/category.php . Примерно 189 строка, на нужен цикл который формирует данные на вывод
php:
Развернуть Свернуть Скопировать
$results = $this->model_catalog_product->getProducts($filter_data);

foreach ($results as $result) {

и в формирование массива $data['products'] добавить получение наших данных по опции, допустим после
php:
Развернуть Свернуть Скопировать
'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url),
добавить
php:
Развернуть Свернуть Скопировать
'min_sum'     => number_format($result['min_opt'], 2)

Ну собственно и всё, теперь min_sum будет доступна в шаблоне в цикле формирования данных


В дальнейшем хочу составить нормальный вариант запроса на получение опций для продукта на страницу категорий и не лепить ту дичь которую советуют как скрин выше. Еще попытаюсь переделать запрос в методе getProducts без запроса в цикле посмотрим что выйдет.
 
  • Like
Реакции: Hkr
Дополнительное решение. Содержит отдельный запрос в контроллере категорий

В модели ModelCatalogProduct создаем свой метод
php:
Развернуть Свернуть Скопировать
    public function getMinOption( $category_id ) {
        
        $sql = "SELECT p.product_id, MIN(pov.price) AS min_summ
                FROM ".DB_PREFIX."product_to_category ptc
                LEFT JOIN " . DB_PREFIX . "product p ON (ptc.product_id = p.product_id)
                LEFT JOIN ".DB_PREFIX."product_option_value pov ON (pov.product_id = ptc.product_id)
                WHERE ptc.category_id = '20' AND p.status = '1' AND p.date_available <= NOW()
                GROUP BY p.product_id ORDER BY p.sort_order ASC";
                
        $query = $this->db->query($sql);
        
        $opt_data = array();
        
        foreach ($query->rows as $result) {
            $opt_data[$result['product_id']] = $result['min_summ'];
        }
        
        return $opt_data;
    }

в контроллере категорий перед циклом делаем запрос

php:
Развернуть Свернуть Скопировать
$data_res = $this->model_catalog_product->getMinOption($category_id);

В формирование массива прописываем

php:
Развернуть Свернуть Скопировать
'min_sum' => number_format( $data_res[$result['product_id']], 2 )
 
Назад
Сверху