Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 25.05.2015 11:15:31

Форма+пагинация может кто сталкивался?

Доброго времени суток.
Если кто сталкивался с ниже описанной задачей подскажите как решали.
В виде списка товаров есть фильтр и есть пагинация страниц.
Проблема в том, что при пагинации по страницам данные фильтра естественно теряются и выдается ошибка.
Я подумываю о сохранении данных в сессии. Но насколько это правильная идея?
Подскажите как решить эту задачу.
Спасибо.

Не в сети

#2 25.05.2015 15:27:17

Re: Форма+пагинация может кто сталкивался?

HunterNomad, покажи код. Каким образом фильтруешь и делаешь пагинацию.

Не в сети

#3 25.05.2015 16:45:34

Re: Форма+пагинация может кто сталкивался?

Дабы "простыни" не выкидывать, приведу основной код
Есть форма в виде где встроен фильтр:

{{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 (в зависимости от цены конечно smile )), но после  пагинации все сбрасывается на исходные количество страниц (т.е. 10).
Я понимаю, что что-то упускаю, но что .....
Мозг уже болит
Спасибо, что откликнулись

Изменено HunterNomad (25.05.2015 16:49:08)

Не в сети

#4 25.05.2015 18:15:35

Re: Форма+пагинация может кто сталкивался?

Уже нашел одну ошибку
есть

..
 $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]) // цена  
...

Но тоник все равно сбрасывает

Не в сети

#5 25.05.2015 18:46:34

Re: Форма+пагинация может кто сталкивался?

явно день не мой
есть

 $filterPriceMax = $data['filter-price-min'];
 $filterPriceMin = $data['filter-price-max'];

нужно

 $filterPriceMin  = $data['filter-price-min'];
 $filterPriceMax = $data['filter-price-max'];

прошу прощения у всех за опечатки
но, увы это проблему сброса при пагинации не решило

Не в сети

#6 26.05.2015 00:44:17

Re: Форма+пагинация может кто сталкивался?

Я не силен в 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)

Не в сети

#7 26.05.2015 12:41:58

Re: Форма+пагинация может кто сталкивался?

Dualse пишет:

П.С. Поправьте, если где-то ошибся)

Не ошибаешься ) Так и есть. При каждой пагинации делается повторный запрос к базе.
Плюс я пытался отправлять из формы методом post
Решение данной проблемы мне подсказал друг (он собственно и исправил код). Нужно перейти на метод get и дописывать параметры в url пагинации.
Собственно все. Спасибо всем кто помогал. Удачи вам! )

Не в сети

Подвал раздела