PHP - Data Paging Example

This code snippet demonstrates a simple class for presenting tabular data with paging. You can override various render methods to customize the rendering behavior.

Usage

  1. $dataSource = array(  
  2.     array('user_id' => 1, 'first_name' => 'John', 'last_name' => 'Smith'),  
  3.     array('user_id' => 2, 'first_name' => 'Linda', 'last_name' => 'Baker'),  
  4.     array('user_id' => 3, 'first_name' => 'Tom', 'last_name' => 'Blake'),  
  5.     array('user_id' => 4, 'first_name' => 'Jia', 'last_name' => 'Li'),  
  6. );  
  7.  
  8. $dataPager = new DataPager();  
  9. $dataPager->setCssClassName('grid');  
  10. $dataPager->setDataSource($dataSource);  
  11. $dataPager->enableHeaders(true);  
  12. $dataPager->addDataNavigateUrl('first_name', '/details.php?id={@user_id}');  
  13. echo $dataPager->render()

DataPager

  1. <?php  
  2.  
  3. class DataPager {  
  4.  
  5.     protected $dataSource = array();  
  6.     protected $headers = array();  
  7.     protected $headerTitleMap = array();  
  8.     protected $enableHeaders = true;  
  9.     protected $dataNavigations = array();  
  10.     protected $pageSize = 0;  
  11.       
  12.     protected $cssClassName;  
  13.     protected $id;  
  14.       
  15.     protected $onHeaderRenderCallBack;  
  16.     protected $onRowRenderCallBack;  
  17.       
  18.     public function __construct(){  
  19.          $this->onHeaderRenderCallBack = array($this, 'renderHeader');  
  20.          $this->onRowRenderCallBack = array($this, 'renderRow');  
  21.          $this->onPagerRenderCallBack = array($this, 'renderPager');  
  22.     }  
  23.       
  24.     public function setCssClassName($cssClassName){  
  25.          $this->cssClassName = $cssClassName;  
  26.     }  
  27.       
  28.     public function setId($id){  
  29.          $this->id = $id;  
  30.     }  
  31.       
  32.     public function setDataSource(array $dataSource){  
  33.          $this->dataSource = $dataSource;  
  34.     }  
  35.       
  36.     public function setHeaders(array $headers){  
  37.          $this->headers = $headers;  
  38.     }  
  39.       
  40.     public function setHeaderTitles(array $titles){  
  41.          $this->headerTitleMap = $titles;  
  42.     }  
  43.       
  44.     public function enableHeaders($bool){  
  45.          $this->enableHeaders = $bool;  
  46.     }  
  47.       
  48.     public function setPageSize($size){  
  49.          $this->pageSize = $size;  
  50.     }  
  51.       
  52.     public function onHeaderRender($callback){  
  53.          $this->onHeaderRenderCallBack = $callback;  
  54.     }  
  55.       
  56.     public function onRowRender($callback){  
  57.          $this->onRowRenderCallBack = $callback;  
  58.     }  
  59.       
  60.     public function onPagerRender($callback){  
  61.          $this->onPagerRenderCallBack = $callback;  
  62.     }  
  63.       
  64.     public function addDataNavigateUrl($field, $navigation){  
  65.          $this->dataNavigations[$field] = $navigation;  
  66.     }  
  67.       
  68.     public function render(){  
  69.          if( count($this->dataSource) > 0){  
  70.               $fieldCount = count($this->dataSource[0]);  
  71.                 
  72.               $control = '<table class="' . $this->cssClassName . '" id="' . $this->id . '">';  
  73.  
  74.               if(count($this->headers) == 0){  
  75.                    $this->headers = array_keys($this->dataSource[0]);  
  76.               }  
  77.                 
  78.               foreach($this->dataSource as $idx=>$row){  
  79.                    if(is_object($row)){  
  80.                         $row = get_object_vars($row);  
  81.                    }  
  82.                      
  83.                    $rowData = array();  
  84.                      
  85.                    foreach($this->headers as $headerField){  
  86.                         if(array_key_exists($headerField, $row)){  
  87.                              $rowData[$headerField] = $row[$headerField];  
  88.                         }else{  
  89.                              unset($this->headers[$headerField]);  
  90.                         }  
  91.                    }  
  92.  
  93.                    $row = $rowData;  
  94.                      
  95.                    if($this->enableHeaders && $idx == 0){  
  96.                         $control .='<thead>';  
  97.                         $control .= call_user_func_array($this->onHeaderRenderCallBack, array($this->headers));  
  98.                         $control .='</thead><tbody>';  
  99.                    }  
  100.                      
  101.                    $control .= call_user_func_array($this->onRowRenderCallBack, array($row));  
  102.               }  
  103.                 
  104.               $control .= '</tbody>';  
  105.               $control .= '<tfoot>';  
  106.               $control .= '<tr><td colspan="' . $fieldCount . '">' . call_user_func_array($this->onPagerRenderCallBack, array($this->pageSize)) . '</td></tr>';  
  107.               $control .= '</tfoot>';  
  108.               $control .= '</table>';  
  109.               return $control;  
  110.          }  
  111.     }  
  112.       
  113.     protected function renderHeader($fields){  
  114.          $control = '<tr>';  
  115.            
  116.          foreach($fields as $header){  
  117.               $title = isset($this->headerTitleMap[$header]) ? $this->headerTitleMap[$header] : $header;  
  118.               $control .= '<th>' . $title . '</th>';  
  119.          }  
  120.            
  121.          $control .= '</tr>';  
  122.          return $control;  
  123.     }  
  124.       
  125.     protected function renderRow($row){  
  126.          $control = '<tr>';  
  127.          foreach($row as $field=>$value){  
  128.               $value = ($value != '') ? $value : ' ';  
  129.                 
  130.               if(isset($this->dataNavigations[$field])){  
  131.                    $link = $this->dataNavigations[$field];  
  132.                      
  133.                    foreach($this->headers as $headerField){  
  134.                         $link = str_replace('{@' . $headerField . '}', $row[$headerField], $link);  
  135.                    }  
  136.                    $link = '<a href="' . $link . '">' . $value . '</a>';  
  137.                    $value = $link;  
  138.               }  
  139.               $control .= '<td>' . $value . '</td>';  
  140.          }  
  141.          $control .= '</tr>';  
  142.          return $control;  
  143.     }  
  144.       
  145.     protected function renderPager($pageSize){  
  146.          $control = '';  
  147.          for($i=1; $i <= $pageSize; $i++){  
  148.               $control .= '<a href="?page=' . $i . '">' . $i . '</a>';  
  149.          }  
  150.          return $control;  
  151.     }  
  152. }  
  153.  
  154. ?> 

No comments:

Post a Comment