Laravel + Ajax - 如何通过GET中的查询字符串查询项目

时间:2016-06-12 16:37:48

标签: javascript php jquery ajax laravel

所以我有一个包含不同产品的产品页面。我有一些颜色和大小的复选框。在复选框更改时,我想使用所需的颜色和大小对我的Laravel控制器进行ajax调用,以查询产品并将其作为json返回,并使用javascript更改旧产品。在另一个选项卡中复制/粘贴完整URL时,我想获得包含查询产品的产品页面。我怎样才能做到这一点?这是我的代码:

 <ul class="color-list">
   @foreach($availableColors as $color)
    <li><input type="checkbox" name="color" value="{{ $color->name }}"></li>
    @endforeach

@foreach($availableSizes as $size)
 <li><input type="checkbox" name="size" value="{{ $size }}">{{ $size }}</li>
@endforeach

这是我的路线:

Route::get('/products/{gender}/{subcategory_name}', [
'uses' => 'ProductsController@showProducts',
'as' => 'products']);

这是我的控制器:

public function showProducts($gender, $subcategory_name)
{
    $subcategory = Subcategory::where('name', $subcategory_name)->first();
    $gender = Gender::where('gender', $gender)->first();

    $availableSubcategories = $this->getAvailableSubcategories($subcategory->category->id);
    $availableColors = $this->getAvailableColors($gender, $subcategory);
    $availableSizes = $this->getAvailableSizes($gender, $subcategory);
    $priceRange = $this->getPriceRange($gender, $subcategory);

    return view('products', [
        'gender' => $gender,
        'subcategory' => $subcategory,
        'availableSubcategories' => $availableSubcategories,
        'availableColors' => $availableColors,
        'availableSizes' => $availableSizes,
        'priceRange' => $priceRange
    ]);
}

代码,建议,解决方案将受到关注。在此先感谢:)

2 个答案:

答案 0 :(得分:1)

嗯,我可能会考虑使用SessionCache。我不会操纵网址(它很丑陋,可以被用户修改)。

所以在你的控制器方法中(注意请求注入):

public function showProducts(Request $request, $gender, $subcategory_name)
{
    // if a session already exists, clear it
    if ($request->session()->has('some_name'))
        $request->session()->forget('some_name');

    // your current logic
    ...

    // store new session ($products = save products array to variable)
    $request->session()->put('some_name', $products);
}

然后在您的视图中检查会话是否存在:

if (Session::has('some_name')) {
    @foreach(Session('some_name') as $some_name)
        ...
    @endforeach
}
else {
    ...
}

你甚至可以在你的循环上做三元组:

@foreach(((Session::has('some_name')) ? Session('some_name')['available_sizes'] : $availableSizes) as $size)
    <li><input type="checkbox" name="size" value="{{ $size }}">{{ $size }</li>
@endforeach

这些都没有经过测试。我只是手工写出来。但它应该给你一个合作的想法!

答案 1 :(得分:0)

您需要通过调用history.pushState来修改URL来操纵浏览器的浏览器历史记录,而无需在每次ajax调用请求时重新加载整个页面。

点击此链接https://developer.mozilla.org/en-US/docs/Web/API/History_API,您也可以使用此javascript插件https://github.com/browserstate/history.js/