0

codeigniterとAjaxを使用してページを下にスクロールするたびに、4つの製品をロードするページを作成しました。

このチュートリアルに従って、codeigniterとjQueryを使用してページ付けを作成しました。
すべてが正常に機能します。さらに、Ajaxを使用してデータベースからロードタイプを変更しました。

codeigniterに問題があります。テーブルからランダムなレコードを取得しようとすると、重複する製品があります。

これはcodeigniterの関数です:

コントローラーの更新

function index()
{
  $this->load->helper('url');
  $data['description'] = "Description";
  $data['keywords'] = "Keywords";
  $data['products'] = $this->abitainterni->getAllProductsLimit();
  $data['get_products'] = $this->abitainterni->get_products();
  $this->load->view('welcome', $data);
}

function get_products($offset)
{
    $already_used = $this->input->post('already_used');
    $already = explode(',', $already_used);
    $data['products'] = $this->abitainterni->getAllProductsLimit($offset, $already);
    $arr['view'] = $this->load->view('get_products', $data, true);
    $bossy = '';

    foreach($data['products'] as $p) {
      $bossy .= $p->productID.',';
    }
    $arr['view'] = $bam;
    $arr['ids'] = $bossy;
    echo json_encode($arr);

    return;
}

スクリプトを更新

<script type="text/javascript">

$(document).ready(function(){

<?
    $like_a_boss = "";

    foreach($products as $gp):
        $like_a_boss .= $gp->productID.',';
    endforeach;
?>

    var products = '<?= $like_a_boss; ?>';
    var loaded_products = 0;

    $(".loadMoreProducts").click(function(){
        loaded_products += 4;

        var dati = "welcome/get_products/" + loaded_products;

        $.ajax({
          url:'welcome/get_products/' + loaded_products,
          type: 'post',
          data: {already_used: products},
          cache: false,
          success: function(data) {

            var obj = $.parseJSON(data);

            $("#mainContainerProductWelcome").append(obj.view);
      already_used += obj.ids;

            if(loaded_products >= products - 4) {
                $(".loadMoreProducts").hide();
            } else {
                // load more still visible
            }
          },
          error: function() {
            // there's something wrong
          }
        });

        // show spinner on ajax request starts
        $(".loading-spinner").ajaxStart(function(){
            $(".loading-spinner").show();
            $(".text-load").hide();
        });

        // ajax request complets hide spinner
        $(".loading-spinner").ajaxStop(function(){
            $(".loading-spinner").delay(5000).hide();
            $(".text-load").show();
        });

        return false;
    });

    // submit form contact
    $(window).scroll(function() {
    if($(window).scrollTop() + $(window).height() >= $(document).height()) {
        // click on load more btn
        $(".loadMoreProducts").click();
        return false;
    }
});

});
</script>
4

1 に答える 1

1

すでにクエリを実行した製品を追跡し、それらのIDを配列にスローしてから、どこにないかなどを使用する必要があります。つまり、次のようになります。

    function getAllProductsLimit($offset=0, $already_used = array(0))
    {
      $this->db->order_by('productID', 'RANDOM');
      $this->db->where_not_in('productID', $already_used);
      $query = $this->db->get('product', 4, $offset);

      if($query->num_rows() > 0){
        return $query->result();
      } else {
        return 0;
      }
    }

NEW CONTROLLER

    function index()
    {
        $this->load->helper('url');
        $data['title'] = "Scopri i nostri prodotti";
        $data['description'] = "Description";
        $data['keywords'] = "Keywords";
        $data['products'] = $this->abitainterni->getAllProductsLimit();
        $data['get_products'] = $this->abitainterni->get_products();
        $this->load->view('welcome', $data);
    }

    function get_products($offset)
    {
        $already_used = $this->input->post('already_used');
        $already = explode(',', $already_used);
        $data['products'] = $this->abitainterni->getAllProductsLimit($offset, $already);
        $arr['view'] = $this->load->view('get_products', $data, true);
            $bossy = '';
    foreach($data['products'] as $p)
            {
        $bossy .= $->productID.',';
            }
            $arr['view'] = $bam;
            $arr['ids'] = $bossy;
echo json_encode($arr);
return;

    }

NEW SCRIPT

<script type="text/javascript">
$(document).ready(function(){

        <?
    $like_a_boss = '';
    foreach($get_products as $gp):?>
    $like_a_boss .= $gp->productID.',';
    endforeach;?>

    var products = '<?= $like_a_boss; ?>';
    var loaded_products = 0;

    $(".loadMoreProducts").click(function(){
        loaded_products += 4;

        var dati = "welcome/get_products/" + loaded_products;

        $.ajax({
          url:'welcome/get_products/' + loaded_products,
          type: 'post',
          data: {already_used: products},
          cache: false,
          success: function(data) {
            var obj = $.parseJSON(data);

            $("#mainContainerProductWelcome").append(obj.view);
            already_used += obj.ids;           

            if(loaded_products >= products - 4) {
                $(".loadMoreProducts").hide();
            } else {
                // load more still visible
            }
          },
          error: function() {
            // there's something wrong
          }
        });

        // show spinner on ajax request starts
        $(".loading-spinner").ajaxStart(function(){
            $(".loading-spinner").show();
            $(".text-load").hide();
        });

        // ajax request complets hide spinner
        $(".loading-spinner").ajaxStop(function(){
            $(".loading-spinner").delay(5000).hide();
            $(".text-load").show();
        });

        return false;
    });

    // submit form contact
    $(window).scroll(function() {
    if($(window).scrollTop() + $(window).height() >= $(document).height()) {
        // click on load more btn
        $(".loadMoreProducts").click();
        return false;
    }
});

});
</script>

次に、その関数を使用する場合は常に、結果をajax関数にエコーアウトする前に、クイックforeachを実行して、取得した製品のIDを既に使用されている配列に追加します。これをセッションとして保存するか、ajaxのものの間でやり取りするか、ajaxのものが正常に記述されている場合は、心配する必要はありません。表示している各製品に製品IDを添付するだけです。データ属性などを使用して、その方法で配列を生成します。

于 2013-01-17T15:21:22.067 に答える