在 Laravel 控制器中对产品数据进行排序后如何重新加载视图?
How can I reload a View after sorting product data in a Laravel controller?
在我正在处理的站点中,我在呈现视图时遇到了一些问题。在网站的产品列表页面上,有一个 'Sort by...' 元素。当用户选择其中一个选项时,它应该重新加载包含已排序产品的产品页面,或者在包含已排序产品的不同 URL 上加载相同视图。哪个都可以,我只想显示订购的产品。对我的 ProductsController
中的产品进行排序效果很好,但是当我想将这些排序的产品传递到前端时,我 运行 遇到了问题。我在下面的代码中返回的视图与产品列表页面的普通视图相同。仅供参考:我对 Laravel 比较陌生,过去主要使用 JavaScript,所以我可能会尝试以一种非常愚蠢的非 Laravel 方式来做到这一点。
理想情况下,我只想将排序后的产品传递给产品列表页面的 Blade 文件。我试过了,但我不知道如何触发重新加载。然后我尝试将用户引导到一条新路线(我在 web.php 中注册),我计划在其中呈现相同的 Products 视图,但使用排序的数据。这也不起作用,并给了我一个空白页面,其中包含模糊的 jQuery 错误消息。
在ProductsController.php中:
public function sortController($type) {
$available_products = Products::with(['gallery', 'slug'])->get()
->where('status', 'available');
$number_of_products = count($available_products);
$product_names_sorted_by_type
= $this->orderProductTitlesBasedOnNumber($number_of_products, $available_products, $type);
$sorted_products_array = $this->orderProductsBasedOnSortedArray($number_of_products, $available_products, $product_names_sorted_by_type);
$product_brands_controller = new ProductsBrandsController;
$brands_list = $product_brands_controller->getBrandNamesArray();
return view('aanbod')->with([
'title' => 'Ons aanbod',
'products' => $sorted_products_array,
'brands' => $brands_list
]);
}
在我的 App.js:
function handleSortRequest(sortRequest) {
sortURL = window.location.origin + '/autos/list/sort?q=' + sortRequest
location.href = sortURL
}
在我的 Web.php:
Route::group(['prefix' => config('site.products.url'), 'as' => 'products.'], function () {
// some other routes...
Route::get('/list/sort/{sort_request}', 'ProductsController@handleSortRequest')->name('sort');
});
无论如何,这不起作用,根本没有渲染任何内容。我只得到一个包含以下错误的空白页:
"TypeError: a is undefined - javascript:2771"
此错误似乎发生在 PHPDebugbar 使用的 jQuery 文件中。
希望这不是太多文字。提前致谢,让我知道如何改进我的 Laravel 代码!
我建议您在表单中进行排序选择,并在选择排序方法后发送请求(通过 js 或单击提交按钮)。然后根据选择的值和return具有排序集合的视图在控制器中处理排序逻辑。
路线:
Route::post('/product/list', [
'uses' => 'ProductController@action',
'as' => 'product.action'
]);
ProductController 操作:
public function action(Request $request)
{
if (isset($request['sort'])) {
// do the sorting logic
}
...
// return view with your sorted products
return view('product.list', ['products' => $sortedProducts]);
}
这只是一个更 Laravel 的例子。
如果您正在执行 AJAX 请求:
ProductController 操作
...
$view = view('product.list', ['products'=> $sortedProducts])->render();
if ($view) {
return response()->json($view, 200);
} else {
return response()->json(null, 400);
}
...
app.js
// inside ajax request
success: function(data) {
$('#some-container').html(data);
},
在我正在处理的站点中,我在呈现视图时遇到了一些问题。在网站的产品列表页面上,有一个 'Sort by...' 元素。当用户选择其中一个选项时,它应该重新加载包含已排序产品的产品页面,或者在包含已排序产品的不同 URL 上加载相同视图。哪个都可以,我只想显示订购的产品。对我的 ProductsController
中的产品进行排序效果很好,但是当我想将这些排序的产品传递到前端时,我 运行 遇到了问题。我在下面的代码中返回的视图与产品列表页面的普通视图相同。仅供参考:我对 Laravel 比较陌生,过去主要使用 JavaScript,所以我可能会尝试以一种非常愚蠢的非 Laravel 方式来做到这一点。
理想情况下,我只想将排序后的产品传递给产品列表页面的 Blade 文件。我试过了,但我不知道如何触发重新加载。然后我尝试将用户引导到一条新路线(我在 web.php 中注册),我计划在其中呈现相同的 Products 视图,但使用排序的数据。这也不起作用,并给了我一个空白页面,其中包含模糊的 jQuery 错误消息。
在ProductsController.php中:
public function sortController($type) {
$available_products = Products::with(['gallery', 'slug'])->get()
->where('status', 'available');
$number_of_products = count($available_products);
$product_names_sorted_by_type
= $this->orderProductTitlesBasedOnNumber($number_of_products, $available_products, $type);
$sorted_products_array = $this->orderProductsBasedOnSortedArray($number_of_products, $available_products, $product_names_sorted_by_type);
$product_brands_controller = new ProductsBrandsController;
$brands_list = $product_brands_controller->getBrandNamesArray();
return view('aanbod')->with([
'title' => 'Ons aanbod',
'products' => $sorted_products_array,
'brands' => $brands_list
]);
}
在我的 App.js:
function handleSortRequest(sortRequest) {
sortURL = window.location.origin + '/autos/list/sort?q=' + sortRequest
location.href = sortURL
}
在我的 Web.php:
Route::group(['prefix' => config('site.products.url'), 'as' => 'products.'], function () {
// some other routes...
Route::get('/list/sort/{sort_request}', 'ProductsController@handleSortRequest')->name('sort');
});
无论如何,这不起作用,根本没有渲染任何内容。我只得到一个包含以下错误的空白页: "TypeError: a is undefined - javascript:2771" 此错误似乎发生在 PHPDebugbar 使用的 jQuery 文件中。
希望这不是太多文字。提前致谢,让我知道如何改进我的 Laravel 代码!
我建议您在表单中进行排序选择,并在选择排序方法后发送请求(通过 js 或单击提交按钮)。然后根据选择的值和return具有排序集合的视图在控制器中处理排序逻辑。
路线:
Route::post('/product/list', [
'uses' => 'ProductController@action',
'as' => 'product.action'
]);
ProductController 操作:
public function action(Request $request)
{
if (isset($request['sort'])) {
// do the sorting logic
}
...
// return view with your sorted products
return view('product.list', ['products' => $sortedProducts]);
}
这只是一个更 Laravel 的例子。
如果您正在执行 AJAX 请求:
ProductController 操作
...
$view = view('product.list', ['products'=> $sortedProducts])->render();
if ($view) {
return response()->json($view, 200);
} else {
return response()->json(null, 400);
}
...
app.js
// inside ajax request
success: function(data) {
$('#some-container').html(data);
},