Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Как добавить новый элемент сортировки на страницу категорий, помимо тех, что есть по умолчанию? (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, но не совсем понимаю, ггде и как это сгделать, и, видимо, нужен ещё какой то код, чтобы сортировка зарилиила.

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

Link to comment
Share on other sites


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

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

Спойлер

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
Link to comment
Share on other sites


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";
        }

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

Link to comment
Share on other sites


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

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

 

 

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

Link to comment
Share on other sites


Спойлер

        <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
Link to comment
Share on other sites


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";
        }

Link to comment
Share on other sites


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

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

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

Link to comment
Share on other sites

  

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'
);



 

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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";

Врогде тоже рилииет.

Edited by petyann
Добавление информации.
Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.