Я работаю над проектом книжного магазина, где книги могут быть добавлены в корзину, пользователь может выбрать множество книг для добавления их в корзину. когда пользователь нажимает кнопку Add to Cart
, я добавляю идентификаторы выбранных книг в массив JS с именем cart
. Когда все выбранные книги будут добавлены в корзину, я хочу связать тег <a>
с вызовом ajax, который попадет в URL-адрес функции контроллера и отправит объект массива JS cart
в функцию контроллера и затем в функции контроллера я хочу вернуть представление в браузер, я не хочу, чтобы функция контроллера возвращала ответ обратно на вызов ajax, но вместо этого я хочу вернуть представление в браузер.
Вот функция JS, которая добавляет ID выбранных книг в массив cart
JS:
function addToCart(id)
{
if(! cart.includes(id) ) cart.push(id);
cartLength.html(cart.length);
$('#successCart'+id).html('Book added to cart.');
}
Вот тег <a>
, который вызывает функцию ajax, имя функции - showCart ():
<a href="#" onclick="event.preventDefault(); showCart();">
<i class="fa fa-shopping-cart"></i>
<span id="cartLength"></span>
</a>
Вот функция showCart()
с кодом ajax:
function showCart()
{
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url:"cart",
method:'post',
data:{cart:cart},
dataType: 'html'
})
.done(function(msg){
});
.fail(function(msg){
alert(msg.responseJSON.errors);
});
}
Вот функция контроллера - мне нужна эта функция чтобы напрямую вернуть представление в браузер, не отправляя его обратно в вызов ajax:
public function showCart(Request $request)
{
return view('cart', ['cart' => $request->cart ]); // this should be returned to the browser and not to the ajax call
}
Вот маршрут для функции контроллера:
Route::post('/cart', 'HomeController@showCart')->name('home.cart');
EDIT :
У меня есть тема временно решил проблему с помощью следующих приемов, но это не является постоянным решением:
После вызова функции showCart()
из ajax
для отправки переменной массива cart
из js
в laravel
контроллер , Я использовал следующий лог c для хранения книг в переменной сеанса, ids
которой хранится в массиве cart
:
public function showCart(Request $request)
{
session()->put('cart_books', Book::whereIn('id', $request->cart)->get());
session()->save();
return "success";
}
После сохранения результата запроса в переменной сеанса , Я создал другой маршрут GET
для /cart
, как показано ниже:
Route::get('/cart', 'HomeController@viewCart');
Затем, после успешного вызова post
ajax, я вызвал /cart
с помощью метода get
, как показано ниже:
.done(function(msg){
console.log('calling cart');
location.href = "cart"; // Here I call the `/cart` with `get` method which will hit the `viewCart()` function of HomeController which will return the view back to the browser along with the results that were stored in the session variable.
})
И это функция контроллера viewCart()
, которая возвращает представление в браузер и отправляет данные переменной сеанса в представление:
public function viewCart()
{
$random_books = Book::all()->random(4);
$categories = Category::all();
return view('cart', ['cart_books' => session()->get('cart_books'),
'random_books' => $random_books, 'categories' => $categories]);
}
Я хочу, чтобы функция контроллера вернуть представление в браузер, не возвращая его при вызове ajax, любая помощь приветствуется заранее.