Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Здравствуйте. Есть задача реализовать сортировку товаров по возрастанию и по убыванию. Хочу сделать это с помощью Ajax, но немного не понимаю логику.
У меня есть такой вот шаблон, который выводит все товары данной категории:
<div class="d-flex justify-content-end flex-grow">
<div class="sorting d-flex">
<div id = "load"></div>
<div class="sorting-title">
<span>Сортировка по цене</span>
<span id = "ASC">по возрастанию</span>
<span id = "DESC">по убыванию</span>
</div>
<!-- <a href="#" class="sort-btn">Акционные</a> -->
</div>
</div>
</form>
</div>
<div id="items-cnt" class="items-cnt row ">
@foreach($products as $product)
<div id = "product" class="col-12 col-sm-6 col-lg-4">
<item v-on:increase="increaseCounter"
v-on:callworker="callWorkerEmit"
:id={{ $product->id }}
item-name="{{ $product->name }}"
@if($product->old_price_wtf)
:current-price={{ $product->price }}
:old-price={{ $product->old_price_wtf }}
@else
@if(!$product->promotion_id)
:current-price={{ $product->price }}
@else
:current-price={{ $product->promotion_price }}
@endif
@if($product->promotion_id)
:old-price={{ $product->price }}
:special-offer-end={{ $product->promotion_end }}
@endif
@endif
@if($product->is_top_sales) :top-sales=true @endif
@if($product->is_new) :new-item=true @endif
@if($product->length) :ceil-width={{ $product->length }} @endif
@if($product->manufacturer) country="{{ $product->manufacturer->name }}" @endif
item-link="/{{ $product->slug }}/p{{ $product->id }}"
:vendor-code={{ $product->number }}
image-src="/uploads/{{ $product->image }}"></item>
</div>
@endforeach
Вот метод в котором я вывожу все товары в шаблон:
$catalog = ProductCategory::where('slug', $catalog_name)->where('is_available', 1)->firstOrFail();
$main_category = ProductCategory::with('products', 'products.manufacturer', 'products.promotion')->where('slug', $main_category_name)->where('parent_id', $catalog->id)->where('is_available', 1)->firstOrFail();
$new_products = $main_category->products;
foreach($new_products as $product){
$products_ids[] = $product->id;
}
//посмотрите, пожалуйста, правильно ли я обрабатываю идентификатор сортировки, чтобы правильно выводить товары?
if($request->sort_id){
$sort = $request->sort_id;
$products_1 = Product::whereIn('id', $products_ids)->orderBy('price', $sort)->paginate(8);
return json_encode(['products' => $products]);
} else {
$products = Product::whereIn('id', $products_ids)->orderBy('price', 'ASC')->paginate(8);
}
return view('category', compact('catalog', 'main_category', 'products'));
Я пыталась написать Ajax запрос, но немного не понимаю как правильно надо перед в него массив продуктов, а потом этот массив отобразить на странице.
Вот мой Ajax запрос:
@section('footer')
<script>
$(document).ready(function(){
$(".sorting-title span").click(function(){
var id = $(this).attr('id');
$.ajax({
url: '/natyazhnye-potolki/natyazhnye-potolki-plenka',
data: 'sort_id='+id,
type: 'get',
success:function(data) {
$("#product").html(data.products);
}
});
});
});
</script>
@endsection
Изменено kittycat_13 (31.08.2017 14:40:48)
Не в сети
Во первых, тебе надо отдавать не целую вьюху (return view(...)) а JSON с товарами.
сделать можно это разными способами, начиная от проверки request()'а на тип запроса, заканчивая другим роутом для товаров (api/natyazhnye-potolki)
вместо $('#product').html... надо бы использовать что-то вроде заготовки, куда ты будет подставять те или иные параметры, ввиде цены и другого...
Это что касало первого варианта, теперь вариант второй:
когда тебе пришел респонс (в твоем случае это вся вьюха в "data"), необходимо взять контейнер с товарами, и заменить его в контенере с товарами .
Не в сети