Арифметическая логика

MilkeyWay

Постоялец
Регистрация
11 Июл 2011
Сообщения
142
Реакции
10
Всем привет!

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

есть CMS опенкарт,хочу сделать в категориях аякс получения данных при изменении кол-ва товаров на странице(см.фото)

c6dfac6de451b3dcdd16ced4517646db.png


так вот если находясь на 1 странце,то все работает как надо,а если допустим поменять кол-во товаров на странице с 10 на 25 допустим,находясь на второй странице,то нифига не работает,сам понимаю почему не работает,но не догоню,как высчитать правильное решение

Допустим есть:

1-всего 12 товаров
2-лимит показа товаров на странице по-умолчания 10,т.е получается 2 страницы,на 1й 10 и на 2й 2
3- кол-во товара можно менять с 10,25,50,75,100

щас логика такова: $data['start'] = ($page - 1) * $data['limit'];

поделитесь мыслями,как добиться правильного решения,т.е если всего товаров меньше,чем $data['limit'] выводить правильное кол-во на страницах отличающихся от 1й
 
Последнее редактирование:
Так все правильно вроде.
 
Так все правильно вроде.
ну если Limit 10 то работает как надо,а если поменять на 25,то возвращает: Показано с 26 по 12 из 12 (всего 1 страниц),находясь на 2й странице,где показывается 2 товара из 12(10 товаров на первой странице) то начинается выборка товара с 25,а товаров то всего 12 и возникает херня
 
ну если Limit 10 то работает как надо,а если поменять на 25,то возвращает: Показано с 26 по 12 из 12 (всего 1 страниц),находясь на 2й странице,где показывается 2 товара из 12(10 товаров на первой странице) то начинается выборка товара с 25,а товаров то всего 12 и возникает херня
Эти вычисления должны делаться при выборке из БД, например так.
Допустим, находимся на странице $page=1, объектов на странице $limit=10, тогда запрос:
Код:
"SELECT * FROM `items` WHERE `category`=3 LIMIT ".($page-1)*$limit.",".$limit";
Вместо items — поставить таблицу товаров, category — таблица категорий, что у Вас там в Опенкарте, я по нему не специалист.
$page-1 у нас получается потому, что массивы в PHP начинаются с нуля, а страницы на сайте — с единицы.
Выборка может быть и с другими параметрами, например так:
Код:
"SELECT * FROM `items` WHERE `category`=3 AND `price`<300 LIMIT ".($page-1)*$limit.",".$limit";
 
Эти вычисления должны делаться при выборке из БД, например так.
Допустим, находимся на странице $page=1, объектов на странице $limit=10, тогда запрос:
Код:
"SELECT * FROM `items` WHERE `category`=3 LIMIT ".($page-1)*$limit.",".$limit";
Вместо items — поставить таблицу товаров, category — таблица категорий, что у Вас там в Опенкарте, я по нему не специалист.
$page-1 у нас получается потому, что массивы в PHP начинаются с нуля, а страницы на сайте — с единицы.
Выборка может быть и с другими параметрами, например так:
Код:
"SELECT * FROM `items` WHERE `category`=3 AND `price`<300 LIMIT ".($page-1)*$limit.",".$limit";
в моделе вот так:

Код:
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'];
     }
 
$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
А что такое $data['start']?
Она должна быть равна (страница-1), умноженной на лимит.
Это место надо обязательно проверить, что там прилетает.
Что касается
Код:
       if($data['start'] < 0) {
         $data['start'] = 0;
       }
то здесь логика прослеживается правильная.
Ещё может быть трабл при аякс запросе не очищаться контейнер, куда добавляются данные.
 
А что такое $data['start']?
Она должна быть равна (страница-1), умноженной на лимит.
Это место надо обязательно проверить, что там прилетает.
Что касается
Код:
       if($data['start'] < 0) {
         $data['start'] = 0;
       }
то здесь логика прослеживается правильная.
Ещё может быть трабл при аякс запросе не очищаться контейнер, куда добавляются данные.
$data['start'] - высчитывается в конроллере:
Код:
$data['start'] = ($page - 1) * $data['limit'];
 
$data['start'] - высчитывается в конроллере:
$data['start'] = ($page - 1) * $data['limit'];
Ну тут всё правильно. Осталось проверить, перед заполнением контейнера с помощью аякса возможно не очищаете старые данные.
Обычно я проверяю, чтобы работало и без аякса, чтобы убедиться, что по логике всё в порядке, потом уже асинхронность прикрутить дело недолгое.
Вообще, если что-то не получается и задача сложновата, разбейте на простые куски и решайте по порядку — этот принцип всегда работает.
 
да все там очищается,просто:

Код:
начинается выборка товара с 25,а товаров то всего 12

нужна логика,типа если товаров меньше,чем Limit...сам не подопетрю,какие условия нужны

$data['start'] = ($page - 1) * $data['limit'] ------ получается:

$data['start'] = (2 - 1) * 25
 
нужна логика,типа если товаров меньше,чем Limit...сам не подопетрю,какие условия нужны
Сделайте подзапрос перед запросом с теми же условиями: — SELECT COUNT(`id`) as cnt FROM ...
И потом второй — если cnt меньше limit, то...
 
Назад
Сверху