Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток.
Если кто сталкивался с ниже описанной задачей подскажите как решали.
В виде списка товаров есть фильтр и есть пагинация страниц.
Проблема в том, что при пагинации по страницам данные фильтра естественно теряются и выдается ошибка.
Я подумываю о сохранении данных в сессии. Но насколько это правильная идея?
Подскажите как решить эту задачу.
Спасибо.
Не в сети
HunterNomad, покажи код. Каким образом фильтруешь и делаешь пагинацию.
Не в сети
Дабы "простыни" не выкидывать, приведу основной код
Есть форма в виде где встроен фильтр:
{{Form::open(['url'=>$category.'/'.$products, 'class' => 'filter-form'])}}
{{Input::flash()}}
<div class="form-group col-md-4">
{{ Form::label(22, 'Цена: ')}}
{{Form::text('filter-price-max', (isset($data['filter-price-max'])) ? $data['filter-price-min'] : null, ['placeholder' => "от",'name' => 'filter-price-min','autocomplite' => 'off', 'class' => 'form-control'])}}
{{Form::text('filter-price-max', (isset($data['filter-price-max'])) ? $data['filter-price-max'] : null, ['placeholder' => "до",'name' => 'filter-price-max','autocomplite' => 'off', 'class' => 'form-control'])}}
</div>
{{Form::submit('Поиск', array('class' => 'btn btn-primary'))}}
{{Form::close()}}
{{-- Вывод списка товаров --}}
@foreach($products as $product)
...
...
@endforeach
{$products->links()}}
Далее routes
...
Route::any('/{category}/{products}', 'ProductController@allProducts');
...
Собственно ProductControlle
public function allProducts($category, $subCategory) {
$data = Input::all();
$products = Product::getAll($data);
return View::make('product.all', [
'products' => $products
]);
}
И на по следок модель Product
public static function getAll($data) {
$products = Filter::cat7($data);
return $products;
}
И модель Filter
public static function cat7($data) { // Category 7
if (!isset($data['_token'])) { // загрузка страницы без фильтрации
$products = DB::table('products')
->where('products.category_id', 7)
->select('products.id', 'products.title', 'products.url', 'products.description', 'products.price', 'products.created_at', 'products.status_product', 'products.hits')
->orderBy('products.created_at', 'DESC')
->paginate(10);
return $products;
}
$filterPriceMax = $data['filter-price-min'];
$filterPriceMin = $data['filter-price-max'];
$price = [$filterPriceMin, $filterPriceMax];
$products = DB::table('products')
->where('products.category_id', 7)
->whereBetween('products.price', $price) // цена
->select('products.id', 'products.title', 'products.url', 'products.description', 'products.price', 'products.created_at', 'products.status_product', 'products.hits')
->orderBy('products.created_at', 'DESC')
->paginate(10);
return $products;
}
Собственно говоря и все. Возможно и не самое изящное решение но, по логике, должно работать.
После ввода в "Фильтр" цены "от" и "до" и отправки ее на сервер фильтрация срабатывает (из 10 страниц остается 4 (в зависимости от цены конечно )), но после пагинации все сбрасывается на исходные количество страниц (т.е. 10).
Я понимаю, что что-то упускаю, но что .....
Мозг уже болит
Спасибо, что откликнулись
Изменено HunterNomad (25.05.2015 16:49:08)
Не в сети
Уже нашел одну ошибку
есть
..
$filterPriceMax = $data['filter-price-min'];
$filterPriceMin = $data['filter-price-max'];
$price = [$filterPriceMin, $filterPriceMax];
...
->whereBetween('products.price', $price) // цена
...
а нужно
..
$filterPriceMax = $data['filter-price-min'];
$filterPriceMin = $data['filter-price-max'];
...
->whereBetween('products.price', [filterPriceMin, filterPriceMax]) // цена
...
Но тоник все равно сбрасывает
Не в сети
явно день не мой
есть
$filterPriceMax = $data['filter-price-min'];
$filterPriceMin = $data['filter-price-max'];
нужно
$filterPriceMin = $data['filter-price-min'];
$filterPriceMax = $data['filter-price-max'];
прошу прощения у всех за опечатки
но, увы это проблему сброса при пагинации не решило
Не в сети
Я не силен в laravel, но думаю проблема вот в чем, когда первый раз фильтруешь, то данные приходят из формы, все хорошо, все работает, но в этот момент, после перезагрузки страницы, форма очищается, следовательно при переходе на вторую страницу, делается обращение к товей функции, где выполняется вот это условие, т.к. форма чистая:
if (!isset($data['_token'])) { // загрузка страницы без фильтрации
$products = DB::table('products')
->where('products.category_id', 7)
->select('products.id', 'products.title', 'products.url', 'products.description', 'products.price', 'products.created_at', 'products.status_product', 'products.hits')
->orderBy('products.created_at', 'DESC')
->paginate(10);
return $products;
}
Думаю понятно, в чем проблема) Надо менять логику этой функции.
П.С. Поправьте, если где-то ошибся)
Изменено Dualse (26.05.2015 00:44:47)
Не в сети
П.С. Поправьте, если где-то ошибся)
Не ошибаешься ) Так и есть. При каждой пагинации делается повторный запрос к базе.
Плюс я пытался отправлять из формы методом post
Решение данной проблемы мне подсказал друг (он собственно и исправил код). Нужно перейти на метод get и дописывать параметры в url пагинации.
Собственно все. Спасибо всем кто помогал. Удачи вам! )
Не в сети
Страницы 1