1

私が取り組んでいるサイトでは、テーブル データを取得し、そのテーブル データをカウントして、標準ループを使用して表示しています。コードの一部を次に示します。

<?php
  $output='';   
  $count=count($deal_datas);
  $face_value="";
  $deal_price="";
  //var_dump(400*20/100);
  $save_value='';       
  $save_value_present='';   
  $category_name='';    
  $cat_ids=array();
  $deal_link='';
  $address_array=array();
  $address='';
  $website_name=''; 
  $website_data=array();

  if($count!=0) {
    for($i=0;$i<$count;$i++) {
      $website_data=get_single_row("web_sites",array("id"=>$deal_datas[$i]->site_id));

      if(count($website_data)!=0) {
        $website_name=$website_data[0]->name;
      }

      $address_array=array();
      $cat_ids=explode(",",$deal_datas[$i]->sub_category_ids);

      if(count($cat_ids)!=0) {
        $where_class=array("id"=>$cat_ids[0]);
        $category_names=get_single_row("sub_category",$where_class);

        if(count($category_names)!=0) {
          $category_name=$category_names[0]->name;
        } else {
          $category_name="All";
        }
      } else {
        $category_name="All";
      }

      $face_value=str_replace("USD","",$deal_datas[$i]->deal_face_value);
      $face_value=str_replace("$","",$face_value);
      $face_value=(int)str_replace(",","",$face_value);
      $save_value_present=(int)str_replace("%","",$deal_datas[$i]->deal_save_percent);

      if($deal_datas[$i]->deal_price!="") {
        $deal_price=str_replace("USD","",$deal_datas[$i]->deal_price);
        $deal_price=(int)str_replace("$","",$deal_price);
        $save_value=$deal_price;
      } else {
        $save_value=$face_value*$save_value_present/100;
      }

      $time_zone_utc=$deal_datas[$i]->deal_oe_end_date;
      $end_date=$time_zone_utc;

      if($website_name!="kgbdeals") {
        $deal_link=base_url()."deals/iframe/".$deal_datas[$i]->slug;
      } else {
        $deal_link=$deal_datas[$i]->deal_link;
      }

      if($deal_datas[$i]->deal_address==0 or $deal_datas[$i]->deal_zip_code==0) {
        $deal_datas[$i]->deal_address="";
        $deal_datas[$i]->deal_zip_code="";
      }

      if($deal_datas[$i]->deal_zip_code!="") {
        $address_array[]=$deal_datas[$i]->deal_zip_code;
  }

      if($deal_datas[$i]->deal_address!="") {
        $address_array[]=$deal_datas[$i]->deal_address;
      }

      $address=implode(" ",$address_array);

      if($deal_datas[$i]->deal_city!="") {
        if(empty($address_array)) {
          $address.=$deal_datas[$i]->deal_city;
        } else {    
          $address.=" - ".$deal_datas[$i]->deal_city;   
        }

        //Check for valid image
        $deal_image=base_url().'uploads/deals/'.$deal_datas[$i]->slug.'.jpg';


        if(getimagesize($deal_image)) {
          $valid_image=1;
        } else {
          $valid_image=0;
        }

        if($i%2==0) {
          $output.='<div class="clsDeal_Whole_Cont clearfix">

次に、テーブル化されたデータのリストなどを出力します。問題は、データが画面に配置される120エントリである場合があり、負荷に時間がかかる場合があることです。

私がやりたいことは、一度に4つまたは8つのエントリのデータを表示します。次に、ユーザーがスクロールするにつれて、さらに追加します。

または - ロードする 4. それらを表示します。次に、さらに 4 つ読み込み、表示します。など、そのようにして、ユーザーはリスト全体を待つのではなく、実際にコンテンツを表示できます (これがより簡単な場合)。それは可能ですか?

これにはjqueryを使用していませんが、スクロールダウンビット全体にjqueryを使用する必要があることはわかっています。では、最終結果に到達するまで 4 のチャンクを表示するために、上記の php を書き直す方法はありますか?

4

2 に答える 2

2

ここでは、質問の仕方から始めて、いくつかの問題があります。関連するすべてのコードを必ず含めてください。手元の問題に対処していない切り捨てられたコードリストがあります。長いデータセットを人間が読める形式に分割する方法。初期データをどのように取得するかについては説明しません。出力のフォーマットの実装の詳細は、この質問に関連していません。さらに、コードは少し混乱しており、単一責任の原則に従っていません。$deals_data

データ選択と表示機能を単一の機能にまとめる必要があります。

//returns n through z rows of data. If '0' is provided for finish, returns all rows
function getData($start=0, $finish=0 {
  $data = array();
  if ($finish == 0) {
    //get all data
  } else {
    //get limited amount of data
  }
  return $data;      
}

//returns first $limit rows of data as an html-encoded output string
function displayDeals($deal_data, $limit) {
  ...
}

その関数は、行ごとに個別の関数を呼び出す必要があります。

//Returns a string of html-encoded data for one row
function displayRow($row_data) {
  ...
}

このdisplayRow関数は$limit、によって何度も呼び出されdisplayDealsます。それが機能するようになると、無限スクロールにAJAXを使用することがはるかに簡単になります。php関数を作成するだけです。

function getMoreRows($start, $numberOfRows) {
  $data = getData($start, $start+$numberOfRows);
  $output = displayDeals($data, $numberOfRows);
  return $ouput;
}

これにより、その出力がphpコードを呼び出したAJAX関数に返されます。HTMLとしてエンコードされているため、使用可能なdivをその新しい文字列に置き換えるだけです。

JQueryを使用するとこのAJAXが簡単になりますが、これを機能させるにはjavascriptが必要になる、毎回新しいphpページへの長いラウンドトリップ呼び出しが発生することに注意してください。後者は簡単ですが、ユーザーインターフェイスをスムーズで遅延読み込みすることを避けます。方法は次のとおりです。

$.ajax({ url: '/my/site',
         data: {action: 'getMoreData'},
         type: 'post',
         success: function(output) {
                      //replace your div with new data
                  }
});

サーバー側では、リクエストを処理するためのphpページが必要です。

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch($action) {
        case 'getMoreData' : getMoreRows($_POST['lastDataIndex'], $_POST['numberOfRowsToFetch']);break;
        // ...etc...
    }
}

スタイルに関するマイナーな追記として:角かっこに関しては、if-elseスタイルの混合に注意する必要があります。一般に、コードをタイトですばやく読みやすくする必要があります。また、コードがブロック内にあるかどうかを疑うことはありません。個人的には、私は常にifとif-elseで角かっこを使用しますが、少なくともifステートメントでは角かっこを使用しないでください。少なくともelseの場合は使用しないでください。人間の読みやすさに注意してください。そうしないと、逆の場合に物事がブロック内にあるかどうかを想定しているために発生するランダムなバグに不満を感じるでしょう。

于 2012-06-26T18:33:47.167 に答える
0

表向きは、データのページ番号を付けたいようです。それは簡単です。リスト内のオフセットにリンクするために動的に生成される次と前のボタンをページに配置するだけです (つまり、page?offset = 4、page?offset = 8)。次に、各ページに 4 つの項目 (offset+1、offset+2、offset+3、offset+4) をロードするだけです。

于 2012-06-26T18:20:31.000 に答える