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

Как добавить новый элемент сортировки на страницу категорий, помимо тех, что есть по умолчанию? (Opencart 3.0.3.8)


Recommended Posts

Стоит Opencart 3.0.3.8 (rs.2).

Как добавить новый элемент сортировки на страницу категорий, помимо тех, что есть по умолчанию?

Нужно добавить сортировку товаров по мощности.

В базе данных (phpMyAdmin) в таблицу oc_product (думаю, что именно в неё нужно) добавил новый параметр "power".

В файле catalog/language/ru-ru/product/category.php прописал:

$_['text_power_asc']    = 'Мощность (низкая > высокая)';
$_['text_power_desc']   = 'Мощность (высокая > низкая)';

 

В файле catalog/controller/product/category.php прописал:

             $data['sorts'][] = array(
                'text'  => $this->language->get('text_power_asc'),
                'value' => 'p.power-ASC',
                'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.power&order=ASC' . $url)
            );

            $data['sorts'][] = array(
                'text'  => $this->language->get('text_power_desc'),
                'value' => 'p.power-DESC',
                'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.power&order=DESC' . $url)
            );

 

В сортировке добавились пункты "Мощность (низкая > высокая)" и "Мощность (высокая > низкая)", но сортировка по ним не работает.

Полагаю, что нужно добавить параметр p.power (или что-то вроде того) в переменную $sql, но не совсем понимаю, где и как это сделать, и, видимо, нужен ещё какой то код, чтобы сортировка заработала.

Можете подсказать более подробно, как это сделать?

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


Видимо один маленький шаг не доделали. 

Посмотрите по аналогии:

Спойлер

catalog/model/catalog/product.php

 

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

        if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
            if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                $sql .= " ORDER BY p.quantity<1, LCASE(" . $data['sort'] . ") ";
            } elseif ($data['sort'] == 'p.price') {
                
        $sql .= " ORDER BY p.quantity<1, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
        } elseif ($data['sort'] == 'p.date_added') {$sql .= " ORDER BY p.quantity<1, p.date_added";

 

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


1 час назад, vvo сказал:

Видимо один маленький шаг не доделали. 

Посмотрите по аналогии:

  Скрыть контент

catalog/model/catalog/product.php

 

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

        if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
            if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                $sql .= " ORDER BY p.quantity<1, LCASE(" . $data['sort'] . ") ";
            } elseif ($data['sort'] == 'p.price') {
                
        $sql .= " ORDER BY p.quantity<1, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
        } elseif ($data['sort'] == 'p.date_added') {$sql .= " ORDER BY p.quantity<1, p.date_added";

 

А там два похожих кода:

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

        if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
            if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
            } elseif ($data['sort'] == 'p.price') {
                $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
            } else {
                $sql .= " ORDER BY " . $data['sort'];
            }
            
        } else {
            $sql .= " ORDER BY p.sort_order";
        }

и

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

        if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
            if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
            } else {
                $sql .= " ORDER BY " . $data['sort'];
            }
        } else {
            $sql .= " ORDER BY p.sort_order";
        }

Я так понимаю, что менять надо в первом. Но вот немного не соображу, как правильно именно в таком коде всё прописать и, главное — как правильно.

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


27 минут назад, petyann сказал:

Я так понимаю, что менять надо в первом. Но вот немного не соображу, как правильно именно в таком коде всё прописать и, главное — как правильно.

 

 

У меня 2.3, посмотрел - код первый в районе 170 строки, второй не трогал

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


Спойлер

        <operation>
            <search index="0"><![CDATA[$sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";]]></search>
            <add position="replace"><![CDATA[
        $sql .= " ORDER BY p.quantity<1, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
        } elseif ($data['sort'] == 'p.date_added') {$sql .= " ORDER BY p.quantity<1, p.date_added";
            ]]></add>
        </operation>

 

сам код в оригинале такой же

p.quantity<1 если не нужно можете убрать, это не если нет товара, p.date_added замените на p.power и пробуйте

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


1 час назад, vvo сказал:
  Показать контент

        <operation>
            <search index="0"><![CDATA[$sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";]]></search>
            <add position="replace"><![CDATA[
        $sql .= " ORDER BY p.quantity<1, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
        } elseif ($data['sort'] == 'p.date_added') {$sql .= " ORDER BY p.quantity<1, p.date_added";
            ]]></add>
        </operation>

 

сам код в оригинале такой же

p.quantity<1 если не нужно можете убрать, это не если нет товара, p.date_added замените на p.power и пробуйте

Спасибо, похоже заработало.

Если кому пригодится, то, помимо вышеизложенного, в catalog/model/catalog/product.php добавил код (красным цветом):

if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
            if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                $sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
            } elseif ($data['sort'] == 'p.price') {
                $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
            } elseif ($data['sort'] == 'p.power') {
                $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.power END)";
            }

            else {
                $sql .= " ORDER BY " . $data['sort'];
            }
        } else {
            $sql .= " ORDER BY p.sort_order";
        }

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


11 минут назад, petyann сказал:

                $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.power END)";

а какое отношение мощность имеет к скидочной цене и вообще к цене товара?

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

  

13 минут назад, petyann сказал:

 } elseif ($data['sort'] == 'p.power') {
                $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.power END)";

а это вообще не надо, от слова совсем.
достаточно вот этого:

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



 

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

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

ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.power END)

Если перевести на русский вот эту вот конструкцию, то получается, что если у товара есть акционная цена, то надо сортировать по ней. Если скидочная  есть - то по ней, а если нет ни той ни другой - то только тогда по мощности.
У вас работает только потому что у товаров нет акционных и скидочных цен.
А подсчет количества при такой сортировке, подозреваю что и не работает вовсе...
Создаете себе же жуткую головную боль. Дайте кому нибудь денежку, вам сделают правильно.

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

51 минуту назад, Prooksius сказал:

Если перевести на русский вот эту вот конструкцию, то получается, что если у товара есть акционная цена, то надо сортировать по ней. Если скидочная  есть - то по ней, а если нет ни той ни другой - то только тогда по мощности.
У вас работает только потому что у товаров нет акционных и скидочных цен.
А подсчет количества при такой сортировке, подозреваю что и не работает вовсе...
Создаете себе же жуткую головную боль. Дайте кому нибудь денежку, вам сделают правильно.

Акционных и скидочных цен там точно не будет. В фильтре товаров (модуль okFilter) количество правильно считает. Но, всё же, желательно сделать правильно. Не подскажете, какой код будет корректным в данном случае?

Попробовал вместо строки

ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.power END)

написать вот так:

$sql .= " ORDER BY p.power";

Вроде тоже работает.

Змінено користувачем petyann
Добавление информации.
Надіслати
Поділитися на інших сайтах


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

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

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

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

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

Вхід

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

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

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

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

Important Information

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