2017-05-11 19 views
1

無限スクロールを使ってdbから製品を見せたいと思っていました。Ajaxを使ったSymfonyの無限スクロール

$start=0; 
    $limit= 6; 

    $query = $repository->createQueryBuilder('classified') 
     ->join('classified.statusId','status') 
     ->andWhere('status.name=:status') 
     ->setParameter('status','active') 
     ->setFirstResult($start) 
     ->setMaxResults($limit) 
     ->getQuery(); 

     $results = $query->getResult(); 

    if ($request->isXmlHttpRequest()){ 

     $list = $this->renderView('search-result.html.twig', [ 
      'results' => $results 
     ]); 


    $response = new JsonResponse(); 
    $response->setData(array('classifiedList' => $list)); 
    return $response; 
} 

アヤックス:

は、ここに私のコントローラである

$(window).scroll(function() { 
      if($(window).scrollTop() + $(window).height()>= $(document).height()){ 
       getmoredata(); 
      } 

     }) 

     function getmoredata() { 
      $.ajax({ 
       type: "GET", 
       url: "{{ path('classified_list', {'type' : 'all'}) }}", 
       dataType: "json", 
       cache: false, 
       success: function (response) { 
         $('.card-deck').append(response.classifiedList); 
         $('#spinner').hide(); 
         console.log(response); 

       }, 
       error: function (response) { 
        console.log(response); 
       } 
      }); 
     } 

だから今スクロールがトリガーされたときに最初の6件の結果が繰り返し表示されている何が起こっているのか。私はこれが正しくないことを知っており、これが適切に動作するとは思わない。しかし、私が知らないことは、次のステップとなることです。 私はページギターなどを追加する必要がありますか?

ありがとうございます、ありがとうございます!

+0

あなたはJavascriptが有効になっている場合のみ動作します行くように見える方向:例えば

window.__isFetching = false; window.__offset = 0; window.__hasMoreData = true; $(window).scroll(function() { if($(window).scrollTop() + $(window).height()>= $(document).height()){ if(!window.__isFetching && window.__hasMoreData) { getmoredata(); } } }) function getmoredata() { window.__isFetching = true; $.ajax({ type: "GET", // NOTE, you can pass current offset here in url url: "{{ path('classified_list', {'type' : 'all', }) }}"+"&offset="+window.__offset, dataType: "json", cache: false, success: function (response) { $('.card-deck').append(response.classifiedList); $('#spinner').hide(); console.log(response); // Note that here, server side response must have next offset and hasMoreData attribut. window.__isFetching = false; window.__hasMoreData = response.hasMoreData; window.__offset = response.offset }, error: function (response) { console.log(response); } }); } 

symfonyのあるサーバ側で、あなたのような何かをしたい場合があります。これは、一般的にjavascriptを持たないため、検索エンジンにとっては非常に悪くなり、ランク付けが低くなります。 SEOに優しい無限のスクロールのためのhttp://infiniteajaxscroll.comを見てください。 –

+0

@JeroenFiege infiniteajaxscroll.comにもjavascriptが必要です。 jQuery用のプラグインですね。 – Arcv

+0

はい、ただし、プログレッシブエンハンスメントを使用し、javadcript/ajaxの依存関係がなくてもサーバー側のページネゴシエーションでは機能しません。検索エンジンは、インデックス作成のためにサーバーサイドページネーションも使用します。 –

答えて

0

あなたのajaxが要求しているかどうかを追跡する必要があるため、ウィンドウがスクロール制限に達すると何度もリクエストを行いません。また、オフセットを追跡し、読み込むデータがさらにあるかどうかを確認する必要があります。

// Get offset from request query 
$start= $request->query->get('offset'); 
$limit= 6; 

$query = $repository->createQueryBuilder('classified') 
    ->join('classified.statusId','status') 
    ->andWhere('status.name=:status') 
    ->setParameter('status','active') 
    ->setFirstResult($start) 
    ->setMaxResults($limit) 
    ->getQuery(); 

    $results = $query->getResult(); 

if ($request->isXmlHttpRequest()){ 

    $list = $this->renderView('search-result.html.twig', [ 
     'results' => $results 
    ]); 


$response = new JsonResponse(); 
// And add offset and hasMoreData fields in response 
$response->setData(array(
    'classifiedList' => $list, 
    'offset' => $start += 1 
    'hasMoreData' => count($list) < ($limit * &start) 
) 
); 
return $response; 
+0

まだ繰り返しの結果が表示されています – Arcv

+0

symfonyコードを変更しましたか? – egig

+0

番号。あなたの行をajaxに追加し、次に繰り返し結果を得ました。 – Arcv

関連する問題