2015-07-05 117 views
1

在文檔頁面上沒有服務器端說明。由於我感到困惑,我想解決我的問題,也許參考服務器端和客戶端代碼。如何在服務器端和客戶端進行select2 infitine滾動分頁

我想使select2(使用v.4.0)無限滾動分頁作爲搜索框,但與params.page混淆。我怎樣才能得到該參數作爲查詢請求,並返回無限滾動頁碼。如何無限滾動觸發器?以下是我的代碼,我只能得到10個結果。

我的代碼的HTML部分是;

<select id="search_products" name="q"></select> 

JS部分是;

jQuery('#search_products').select2({   
    ajax: { 
     url: "search_results.php", 
     dataType: 'json', 
     delay: 250, 
     data: function (params) { 
      return { 
      q: params.term, // search term 
      page_limit: 10, 
      page:params.page 
      }; 
     }, 

     processResults: function (data, params) { 

     params.page = params.page || 1; 

     return { 
      results: data.items, 
      pagination: { 
      more: (params.page * 30) < data.total   
      } 
     }; 

     },    
     cache: true 
     }, 
     escapeMarkup: function (markup) { return markup; }, 
     minimumInputLength: 3, 
     templateResult: formatRepo, 
     templateSelection: formatRepoSelection 
}); 

function formatRepo (repo) { 
    if (repo.loading) return repo.adi; 

    var markup = '<div class="clearfix">' +   
    '<div class="col-sm-7">' + repo.name + '</div>' + 
    '<div class="col-sm-4"><i class="fa fa-barcode"></i> ' + repo.barkod + '</div>'; 

    return markup; 
    } 

    function formatRepoSelection (repo) { 
    return repo.adi; 
    } 

服務器端 - PHP部分(search_results.php)是:

if (isset($_REQUEST['q']) && !empty($_REQUEST['q'])) { 

    $q = getVar('q', 'anp'); //getVar is my custom sanitation function 
    $pglm = getVar('page_limit', 'int'); 
    $page_lim = (empty($pglm) ? 10 : $pglm); 
    $pg = getVar('page', 'int'); 
    $page = (empty($pg) ? 0 : $pg); 
    $sira = $page*$page_lim; 

    //using MYSQL, querying with custom database query class $db 
    $qu = $db->get_results(" 
        SELECT * FROM `products` 
        WHERE `adi` LIKE '%$q%' 
        OR `ozellikleri` LIKE '%$q%' 
        OR `ozet` LIKE '%$q%' 
        OR `barkod` LIKE '%$q%' LIMIT $sira, $page_lim 
        "); 

    if($qu && count($qu) > 0) { 
     foreach ($qu as $oqu) { 
      $items[] = array('name' => $oqu->adi, 'id' => $oqu->id, 'barkod' => $oqu->barkod); 
      } 

     echo json_encode(array('items' => $items, 'total' => count($qu), 'page' => $page)); 
    } 
} 
+0

您是否在控制檯中看到任何異常?你確定你正在生成你的'LIMIT'嗎?事情的JS方面看起來是正確的。 –

+0

沒有例外。據我瞭解'params.page'是當前頁碼。問題是我該如何將此號碼發送到服務器。在PHP代碼中,我試圖得到'$ pg = getVar('page','int');'但它不採取行動。 – ewroman

回答

0

有問題,在你的代碼,無論是在客戶端和服務器端。

在客戶端,請嘗試更換此:

data: function (params) { 
    return { 
     q: params.term, // search term 
     page_limit: 10, 
     page:params.page 
    }; 
}, 
processResults: function (data, params) { 
    params.page = params.page || 1; 
    return { 
     results: data.items, 
     pagination: { 
      more: (params.page * 30) < data.total   
     } 
    } 
}; 

對於這一點:

var limit_rows = 10; 
... 
data: function (params) { 
    return { 
     q: params.term, // search term 
     page_limit: limit_rows, 
     page:params.page 
    }; 
}, 
processResults: function (data, params) { 
    params.page = params.page || 1; 
    return { 
     results: data.items, 
     pagination: { 
      more: (params.page * limit_rows) < data.total   
     } 
    } 
}; 

這樣一來,選擇2將正確地解析頁面的限制,因此,以 「limit_rows」 變量。請注意,我在「processResults」方法內更改了「limit_rows」var的30個字段,現在該字段正確顯示每個搜索的10個結果。

在服務器端,有兩個問題:

  • 你的總數是錯誤的。您需要在查詢中返回沒有LIMIT的總行數。這樣可以避免像總是從頁面限制中返回的值一樣(在你的情況下,10)。
  • 由於json返回的數組缺少一些信息。嘗試改變此:

    回波json_encode( 陣列( '項'=> $物品, '總'=>計數($曲), '頁'=> $頁) );

對於這一點:

echo json_encode(
    array(
     'incomplete_results' => false, 
     'items' => $items, 
     'total' => count($qu) // Total rows without LIMIT on your SQL query 
); 

爲我工作。