所以我有一个包含不同产品的产品页面。我有一些颜色和大小的复选框。在复选框更改时,我想使用所需的颜色和大小对我的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
]);
}
代码,建议,解决方案将受到关注。在此先感谢:)
答案 0 :(得分:1)
嗯,我可能会考虑使用Session
或Cache
。我不会操纵网址(它很丑陋,可以被用户修改)。
所以在你的控制器方法中(注意请求注入):
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/