带有自定义过滤器的Ajax分页器

时间:2018-07-10 20:59:39

标签: ajax laravel

我已成功采用了本指南:https://laraget.com/blog/how-to-create-an-ajax-pagination-using-laravel可以满足我的需要,它可以工作,但是如果应用自定义过滤器,则分页将不起作用。

让我们从routes / web.php开始:

// products routes
Route::get('products', 'ProductController@index')->name('CatalogIndex');
// sorting products with custom filters
Route::post('products', 'ProductController@Filters');

然后我们要转到ProductController.php:

public function index(Request $request)
{
    $products = Product::orderBy('created_at', 'desc')->paginate(12);

    if ($request->ajax()) {
        $products_view = view('includes.products', compact('products'))->render();
        return response()->json(compact('products_view'));
    }

    return view('catalog.index', compact('products', 'power', 'area', 'source'));
}

    // filtering products
    public function Filters(Request $request, Product $product)
    {
        if ($request->ajax()) {
            // using query builder here
            $prods = $product->newQuery();
            // sorting by price
            if ($request->has('order')) {
                if ($request->input('order') == 'default') {
                    $prods->orderBy('created_at', 'desc');
                } else {
                    $prods->orderBy('price', $request->input('order'));
                }
            }

// more filters omitted for readability

            $products = $prods->paginate(12);

            $products_view = view('includes.products', compact('products'))->render();
            return response()->json(compact('products_view'));
        }

        return abort(403, 'Unauthorized action.');
    }

一些使这些过滤器起作用的javascript:

        $('body').on('click', '.pagination a', function(e) {
            e.preventDefault();

            var url = $(this).attr('href');
            getProducts(url);
            window.history.pushState("", "", url);
        });

        function getProducts(url) {
            $.ajax({
                method: 'get',
                url: url,
                success: function(data) {
                    $('#products').html(data.products_view);
                    console.log(data);
                },
                error: function(jqxhr, status, exception) {
                    console.log('Error' + exception);
                }
            });
        }

现在是问题,如果我不应用任何过滤器,但如果应用过滤器(选择电源等于某物的所有产品,等等),那么当我单击a时,使用ajax进行常规分页就可以了分页链接,它只会导致我在第二页上的ProductController的索引方法忽略我的过滤器,还将url更改为“ products?page = 2”,我期望以下行为->当您应用源过滤器== somevalue时,然后单击第二页,将显示所有应用了源过滤器的产品的第二页,现在仅显示索引方法,并按created_at列进行简单排序。

3 个答案:

答案 0 :(得分:1)

您需要:

刀片上的

像这样在分页器上附加addicional参数:

  {!!  $products->appends(['param1' => 'val1', 'param2'=>'val2'])->links() !!}

然后在方法index()上执行该操作:

 if ($request->ajax()) {
    return $this->filters($request, $product); 
}

祝你好运。

答案 1 :(得分:0)

您的http方法不匹配。尝试将路线更改为“获取”而不是“发布”,看看是否可以解决

答案 2 :(得分:0)

使用查询字符串结束并切换到GET方法。