Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 31.08.2017 14:38:02

Передать массив данных из метода контроллера в Ajax в шаблоне

Здравствуйте. Есть задача реализовать сортировку товаров по возрастанию и по убыванию. Хочу сделать это с помощью 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)

Не в сети

#2 01.09.2017 23:17:10

Quiss
Откуда: Moscow
Сообщений: 32
Сайт

Re: Передать массив данных из метода контроллера в Ajax в шаблоне

Во первых, тебе надо отдавать не целую вьюху (return view(...)) а JSON с товарами.

сделать можно это разными способами, начиная от проверки request()'а на тип запроса, заканчивая другим роутом для товаров (api/natyazhnye-potolki)

вместо $('#product').html... надо бы использовать что-то вроде заготовки, куда ты будет подставять те или иные параметры, ввиде цены и другого...

Это что касало первого варианта, теперь вариант второй:
когда тебе пришел респонс (в твоем случае это вся вьюха в "data"), необходимо взять контейнер с товарами, и заменить его в контенере с товарами big_smile.

Не в сети

Подвал раздела