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,尽管我知道我需要整个向下滚动位。那么,有没有办法重写上面的 php 以显示 4 块,直到达到最终结果?

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 和 if-else 风格。通常,您希望您的代码紧凑且快速可读,并且您希望永远不要怀疑代码是否在一个块中。就个人而言,我总是在 if 和 if-else 中使用方括号,但你应该避免在 if 语句中使用方括号,至少不要在 else 情况下使用方括号。注意人类的可读性,否则你会发现随机出现的错误会让你感到沮丧,因为你假设一个东西在或不在一个块中,而事实恰恰相反。

于 2012-06-26T18:33:47.167 回答
0

在我看来,表面上,您想对数据进行分页。这很容易做到。只需在页面上有下一个和上一个按钮,它们是动态生成的,以链接到列表中的偏移量(即 page?offset = 4,page?offset = 8)。然后只需在每个页面上加载四个项目(offset+1、offset+2、offset+3 和 offset+4)。

于 2012-06-26T18:20:31.000 回答