Membuat Paggination
Tags: tutorial, php
Published: 2021-01-01 10:51:36

Ketika Saya memiliki banyak data dan itu ditampilkan dalam Web. Hal ini akan menjadi masalah ketika banyak data tersebut berpengaruh pada banyaknya *bandwidth* atau nilai estetik web. Akhirnya pemberian halaman atau pagination itu penting. Berikut class pagination sederhana yang mungkin dapat membantu mengerti cara kerja dari pagination.

### Persiapan
- Mengerti bagaimana menggunakan [Class](https://www.w3schools.com/php/php_oop_classes_objects.asp)
- Fungsi-fungsi php seperti [count](https://www.php.net/manual/en/function.count.php), [max](https://www.php.net/manual/en/function.max.php), [min](https://www.php.net/manual/en/function.min), [ceil](https://www.php.net/manual/en/function.ceil), [array_slice](https://www.php.net/manual/en/function.array-slice), [sprintf](https://www.php.net/manual/en/function.sprintf).
- Penggunaan `$this`

### 1. Set Komponen
Dalam set komponen dibuat dalam bentuk fungsi, dan komponen-komponen yang diperlukan seperti keterangan halaman berapa `$page`, jumlah page dalam `$arr_page`dan Batasan _items_ dalam satu page `$limit`, seperti berikut:
```php
    public $page;
    public $limit;
    public $offset;
    public $totalPages;
    public $arr_page;
    public $link;

    public function setPager($page, $arr_page, $limit, $link) 
    { 
      $total = count( $arr_page );
      $totalPages = ceil( $total/ $limit );
 
      // proses QC $page input agar dalam batasan range total pages
      $page = max($page, 1);
      $page = min($page, $totalPages);
      $offset = ($page - 1) * $limit;
      if( $offset < 0 ) $offset = 0;

      // deklarasi page
      $this->page = $page;
      $this->limit  = $limit;
      $this->offset = $offset;
      $this->totalPages = $totalPages;
      $this->arr_page = $arr_page;
      $this->link = $link;
    }   
```
### 2. Items dalam Page
Fungsi berikut akan memanfaatkan komponen yang telah diset untuk menentukan _items_ yang akan ikut dimasukan. Dengan memanfaatkan fungsi php `array_slice`, fungsi akan memotong `array` dari _offset_ yang diingikan pada _limit_ yang diperlukan.

```php
 public function getArrayPage() 
    { 
        $res_testimony_page = array_slice( $this->arr_page, $this->offset, $this->limit );
        return $res_testimony_page;
    }
```

### 3. Membangun Pager Sederhana
dalam fungsi pembuat _conteiner pager_ ini ada beberapa bentuk, tampilan yang dihasilkan cuba berupa keterangan page dan total page, serta tombol _next_ dan _prev_. Terlihat seperti `<< 1/10 >> `

```php
 public function getTestiContainerPager()
    {    
      $ret = '<div style="min-width: 300px;">';
      if( $this->totalPages != 0 ) {

        // Keterangan page aktif sebelah kiri
        if( $this->page == 1 ) {
          $ret .= '';
        }
        else {
          $ret .= sprintf( '<a href="?' . $this->link . '=%d" style="color: #0f4c75">&#171; prev</a>', $this->page - 1 );
        }
         
        // penunjuk total pages
        $ret .= ' <span><strong>' . $this->page . '</strong> / ' . $this->totalPages . '</span> ';

        // Keterangan page aktif sebelah Kanan
        if( $this->page == $this->totalPages ) {
          $ret .= '';
        }
        else {
          $ret .= sprintf( '<a href="?' . $this->link .'=%d" style="color: #0f4c75">next &#187;</a>', $this->page + 1 );
        }
      }
      $ret .= '</div>';
      
      return $ret;
  }
```
### 4. Menggunakan code
```php
$pager = new Pagination();
$pager->setPager(1,50,10,testi.php);
$items_page = $pager->getArrayPage();
$con_pager = $pager->getTestiContainerPager();
```

***Done***

### Keseluruhan code
```php 
class Pagination 
{ 

    private $page;
    private $limit;
    private $offset;
    private $totalPages;
    private $arr_page;
    private $link;

    public function setPager($page, $arr_page, $limit, $link) 
    { 
      $total = count( $arr_page );
      $totalPages = ceil( $total/ $limit ); 
      $page = max($page, 1);
      $page = min($page, $totalPages);
            $offset = ($page - 1) * $limit;
      if( $offset < 0 ) $offset = 0;
      $this->page = $page;
      $this->limit  = $limit;
      $this->offset = $offset;
      $this->totalPages = $totalPages;
      $this->arr_page = $arr_page;
      $this->link = $link;
    }   

    public function getArrayPage() 
    { 
        $res_testimony_page = array_slice( $this->arr_page, $this->offset, $this->limit );
        return $res_testimony_page;
    }

    public function getTestiContainerPager()
    {    
      $ret = '<div style="min-width: 300px;">';
      if( $this->totalPages != 0 ) {
        if( $this->page == 1 ) {
          $ret .= '';
        }
        else {
          $ret .= sprintf( '<a href="?' . $this->link . '=%d" style="color: #0f4c75">&#171; prev</a>', $this->page - 1 );
        }
        $ret .= ' <span><strong>' . $this->page . '</strong> / ' . $this->totalPages . '</span> ';

        if( $this->page == $this->totalPages ) {
          $ret .= '';
        }
        else {
          $ret .= sprintf( '<a href="?' . $this->link .'=%d" style="color: #0f4c75">next &#187;</a>', $this->page + 1 );
        }
      }
      $ret .= '</div>';
      
      return $ret;
  }
}

```