Ang Pagination sa CodeIgniter: Ang Kumpletong Gabay
Tagalog (Wikang Tagalog) translation by Anna Nelson (you can also view the original English article)
Ang benepisyo ng paggamit ng kahit na anong full-stack na web application framework ay hindi mo na iisipin pa ang mga karaniwang mga gawain tulad ng input handling, form validation at ang mga tulad nito. Dahil ang framework ay nagbibigay na ng mga wrapper para sa mga feature na ito. At dahil dito, binibigyan ka ng panahon para mas bigyang-pansin ang business logic ng application sa halip na muling baguhin ang wheel ng paulit-ulit.
Ngayon, sisiyasatin natin ang mahalagang library sa CodeIgniter framework—ang pagination library.
Hayaan niyo akong bigyang-diin ang mga paksa na ating tatalakayin sa loob ng artikulo na ito:
- Ang pagpapakilala sa basic paging
- Alamin ang mga opsyon para sa customization
- Ang pagination configuration
Pagpapakita ng Pangunahing Paging
Sa bahaging ito, titingnan natin ang isang halimbawa na nagpapakita ng paggamit ng pagination sa CodeIgniter. Ito ang pinakamainam na paraan upang maunawaan kung paano gumagana ang lahat ng ito.
Sa ating halimbawa, tayo ay gumawa ng isang
simpleng user listing na kung saan tayo ay kukuha ng mga rekord mula sa mga
users MySQL table. Upang magamit nang maayos ang halimbawang ito, tiyakin na
mayroon ka ng uid
at uname
fields sa iyong users table.
Sa ganitong anyo, maaari na tayong magsimula.
Halina’t lumikha ng controller
file controllers/Paging.php
na may mga sumusunod na nilalaman.
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Paging extends CI_Controller { public function __construct() { parent::__construct(); // load Pagination library $this->load->library('pagination'); // load URL helper $this->load->helper('url'); } public function index() { // load db and model $this->load->database(); $this->load->model('Users'); // init params $params = array(); $limit_per_page = 1; $start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; $total_records = $this->Users->get_total(); if ($total_records > 0) { // get current page records $params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index); $config['base_url'] = base_url() . 'paging/index'; $config['total_rows'] = $total_records; $config['per_page'] = $limit_per_page; $config["uri_segment"] = 3; $this->pagination->initialize($config); // build paging links $params["links"] = $this->pagination->create_links(); } $this->load->view('user_listing', $params); } public function custom() { // load db and model $this->load->database(); $this->load->model('Users'); // init params $params = array(); $limit_per_page = 2; $page = ($this->uri->segment(3)) ? ($this->uri->segment(3) - 1) : 0; $total_records = $this->Users->get_total(); if ($total_records > 0) { // get current page records $params["results"] = $this->Users->get_current_page_records($limit_per_page, $page*$limit_per_page); $config['base_url'] = base_url() . 'paging/custom'; $config['total_rows'] = $total_records; $config['per_page'] = $limit_per_page; $config["uri_segment"] = 3; // custom paging configuration $config['num_links'] = 2; $config['use_page_numbers'] = TRUE; $config['reuse_query_string'] = TRUE; $config['full_tag_open'] = '<div class="pagination">'; $config['full_tag_close'] = '</div>'; $config['first_link'] = 'First Page'; $config['first_tag_open'] = '<span class="firstlink">'; $config['first_tag_close'] = '</span>'; $config['last_link'] = 'Last Page'; $config['last_tag_open'] = '<span class="lastlink">'; $config['last_tag_close'] = '</span>'; $config['next_link'] = 'Next Page'; $config['next_tag_open'] = '<span class="nextlink">'; $config['next_tag_close'] = '</span>'; $config['prev_link'] = 'Prev Page'; $config['prev_tag_open'] = '<span class="prevlink">'; $config['prev_tag_close'] = '</span>'; $config['cur_tag_open'] = '<span class="curlink">'; $config['cur_tag_close'] = '</span>'; $config['num_tag_open'] = '<span class="numlink">'; $config['num_tag_close'] = '</span>'; $this->pagination->initialize($config); // build paging links $params["links"] = $this->pagination->create_links(); } $this->load->view('user_listing', $params); } }
Sunod, kinakailangan natin ang isang model
file models/Users.php
na kumukuha ng mga rekord mula sa users table.
<?php // models/Users.php defined('BASEPATH') OR exit('No direct script access allowed'); class Users extends CI_Model { function __construct() { parent::__construct(); } public function get_current_page_records($limit, $start) { $this->db->limit($limit, $start); $query = $this->db->get("users"); if ($query->num_rows() > 0) { foreach ($query->result() as $row) { $data[] = $row; } return $data; } return false; } public function get_total() { return $this->db->count_all("users"); } }
At ang panghuli, gumawa tayo ng view file
sa views/user_listing.php
that na nagpapakita ng user listing.
<!-- views/user_listing.php --> <html> <head> <title>Paging Example-User Listing</title> </head> <body> <div class="container"> <h1 id='form_head'>User Listing</h1> <?php if (isset($results)) { ?> <table border="1" cellpadding="0" cellspacing="0"> <tr> <th>ID</th> <th>NAME</th> </tr> <?php foreach ($results as $data) { ?> <tr> <td><?php echo $data->uid ?></td> <td><?php echo $data->uname ?></td> </tr> <?php } ?> </table> <?php } else { ?> <div>No user(s) found.</div> <?php } ?> <?php if (isset($links)) { ?> <?php echo $links ?> <?php } ?> </div> </body> </html>
Ngayon, halina’t puntahan ang ating custom page sa http://your-code-igniter-site/paging/index at dapat makita mo ang user listing kasama ng pagination. Hayan, nagawa na natin! Huwag mag-alala, hindi ko kayo iiwan agad-agad dahil sisimulan na natin ang pagsusuri sa bawat bahagi ng code ngayon.
Simulan natin sa model file
models/Users.php
dahil ito ay makukuha natin mula sa ating mga controller
method. May dalawang mahahalagang method, get_current_page_record
s
at get_total
, na ginagamit ng ating modelo upang lumikha ng mga pagination
link.
Puntahan natin ang get_total
method. Ito ay
ginagamit upang mabilang ang mga rekord sa users table.
public function get_total() { return $this->db->count_all("users"); }
Sunod, may tinatawag na
get_current_page_records
method.
public function get_current_page_records($limit, $start) { $this->db->limit($limit, $start); $query = $this->db->get("users"); if ($query->num_rows() > 0) { foreach ($query->result() as $row) { $data[] = $row; } return $data; } return false; }
May dalawang mahahalagang argumento na
dapat mong malaman sa the get_current_page_records
method. Ang unang argumento, $limit
, na ginagamit
upang tukuyin ang bilang ng mga rekord na ibabalik sa panahon ng query run. At
ang ikalawang argumento, $star
t, ang tumatayong starting index ng rekord.
Tulad ng iyong nakikita, makakakuha ka ng
mga rekord sa pamamagitan ng page kung may value ang $start
at $limit
. Iyan
ang kagandahan ng paging, samantala ginamit din namin ang pinakamahalagang
method sa artikulong ito.
Iyan ang aming modelo—simple at elegante!
Sa pagpapatuloy, bigyan naman natin ng atensiyon ang controller file. Halina’t gamitin ang code ng constructor method.
public function __construct() { parent::__construct(); // load Pagination library $this->load->library('pagination'); // load URL helper $this->load->helper('url'); }
Upang magamit ang pagination sa
CodeIgniter, kailangan mo munang gawin ang pagload ng pagination library. At
ito ay magagawa natin sa pamamagitan ng paggamit ng
$this->load->library('pagination').
Inilagay din natin ang URL helper upang magamit natin ang mga global helper function na inilaan ng helper.
Ngayon, handa na tayong tumungo sa puso ng
ating controller—ang index
method.
public function index() { // load db and model $this->load->database(); $this->load->model('Users'); // init params $params = array(); $limit_per_page = 1; $start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; $total_records = $this->Users->get_total(); if ($total_records > 0) { // get current page records $params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index); $config['base_url'] = base_url() . 'paging/index'; $config['total_rows'] = $total_records; $config['per_page'] = $limit_per_page; $config["uri_segment"] = 3; $this->pagination->initialize($config); // build paging links $params["links"] = $this->pagination->create_links(); } $this->load->view('user_listing', $params); }
Upang masimulan ito, kailangan nating
tiyakin na ang database ay nakaload nang maayos. Pagkatapos nito, ilalagay
natin ang Users
model para magamit natin ang mga model method.
$this->load->database(); $this->load->model('Users');
Pagkatapos, sisimulan natin ang ilang mga mahahalagang variable.
// init params $params = array(); $limit_per_page = 1; $start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; $total_records = $this->Users->get_total();
Ang variable $limit_per_page
ang nagtatakda
ng limitasyon sa bawat page. Siyempre, maaari mo din itong itakda. Para sa
halimbawa natin ngayon, ito ay itinakda sa 1.
Ang $start_index
variable ang naglalaman ng
starting index ng MySQL record. Kapag ang CodeIgniter ay gumagawa ng mga
pagination link, isinasama nito ang starting index ng page bilang ikatlong
segment sa URL bilang default. Maaari mong baguhin ang default na behavior
na ito, subalit ito ay nilaan namin para sa huling bahagi ng artikulong ito na
kung saan ating tatalakayin ang mga opsyon sa customization.
At ang panghuli, gagamitin natin ang
get_total
method ng Users model upang kuhanin ang kabuuang mga rekord ng users
table, at ito ay nakatalaga sa $total_records
variable.
Sunod, kukunin natin ang mga rekord ng
kasalukuyang page sa pamamagitan ng ang get_current_page_records
method.
// get current page records $params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index);
Bago tayo makagawa ng mga pagination link,
kailangan natin simulan ang minimal paging configuration gamit ang initialize
method ng paging library.
$config['base_url'] = base_url() . 'paging/index'; $config['total_rows'] = $total_records; $config['per_page'] = $limit_per_page; $config["uri_segment"] = 3; $this->pagination->initialize($config);
At iyan ang set ng mga minimum na parameter para makagawa ng mga pagination link.
- base_url: Ang URL na gagamitin habang ginagawa ang mga pagination link
- total_rows: Ang kabuuang bilang ng mga rekord
- per_page: Ang Rekord count sa bawat page
At ang panghuli, gagamitin natin ang
create_links
method sa paggawa ng mga pagination link.
// build paging links $params["links"] = $this->pagination->create_links();
Ang natitira ay isang pormalidad sa
pagtawag ng ating view user_listing
at ang pagbibigay ng output! I-run ang URL http://your-code-igniter-site/paging/index
upang makita ang user listing kasama ng mga pagination link.
Iyon ang pinakasimple ngunit kapaki-pakinabang na halimbawa ng pagination na maaaring mong gamitin upang ito ay maging angkop sa nais mo.
Sa susunod na bahagi, tatalakayin natin kung paano i-customize ang default pagination sa paggamit ng appearance at functionality.
Alamin ang mga opsyon para sa customization
Sa bahaging ito, malalaman mo ang mga opsyon na maaari mong gamitin kung nais mong i-customize ang mga default pagination link.
Ang URI Segment
Kahit na ang CodeIgniter paging library ay awtomatikong nalalaman ang mga paging-related parameter mula sa URL, maaari mo din namang tukuyin ang custom value kung mayroon kang iba’t-ibang URL pattern.
$config["uri_segment"] = 4;
Ang bilang ng mga digit links
Ang num_links
na opsyon ay nagbibigay ng
pahintulot sa iyo na tukuyin ang bilang ng digit links na makikita bago at
pagkatapos ng active page number sa mga pagination link.
$config['num_links'] = 2;
Ang Page Number bilang URI Segment
Kapag pumunta ka sa paging URI segment,
iyon ang starting index bilang default nito. Halimbawa, kung may sampu kang
rekord sa bawat page, ang paging URI segment ay 20 para sa ikatlong page. Sa halip, kung nais mong ipakita ang aktwal
na mga page number sa mga paging link, maaari mong gawing set use_page_numbers
sa TRUE
.
$config['use_page_numbers'] = TRUE;
Siyempre, dapat tiyaking nakalkula nang maayos ang starting index base sa page number na nakuha mula sa URL.
Ang Preserve Query String
Kadalasan, ikaw ay napupunta sa sitwasyon
na nais mong panatilihin ang mga query string parameter na walang kaugnayan sa
pagination. Maaari mong gamitin ang reuse_query_string
na opsyon para magamit
ito.
$config['reuse_query_string'] = TRUE;
Ito ang ilan sa mga opsyon na maaari mong gamitin upang mabago ang default pagination functionality. Pagkatapos, titingnan natin ang iba pang mga opsyon na magpapahintulot sa iyong baguhin ang paraan kung paano ipinapakita ang mga pagination link.
Ang Wrapper Tag
Kung nais mong i-wrap ang pagination code
gamit ang iba pang HTML tag, maaari mo itong gawin sa pamamagitan ng paggamit
ng full_tag_open
at full_tag_close
na mga opsyon.
$config['full_tag_open'] = '<div class="pagination">'; $config['full_tag_close'] = '</div>';
Ito ay magiging kapaki-pakinabang kung nais mong gumamit ng custom styling sa mga pagination link.
Ang First, Last, Next, at Previous
Kung nais mong baguhin ang text na ipapakita para sa first, last, next at mga previous link, maaari mo din itong gawin.
$config['first_link'] = 'First Page'; $config['last_link'] = 'Last Page'; $config['next_link'] = 'Next Page'; $config['prev_link'] = 'Prev Page';
At kung nais mo din na i-wrap ang mga indibidwal na link gamit ang kahit na anong HTML tag, maaari mo din itong gawin tulad kung paano mo nilagyan ng wrap ang buong paging code.
$config['first_tag_open'] = '<span class="firstlink">'; $config['first_tag_close'] = '</span>'; $config['last_tag_open'] = '<span class="lastlink">'; $config['last_tag_close'] = '</span>'; $config['next_tag_open'] = '<span class="nextlink">'; $config['next_tag_close'] = '</span>'; $config['prev_tag_open'] = '<span class="prevlink">'; $config['prev_tag_close'] = '</span>';
Ang Active Link at Number Link
Minsan, nanaisin mong bigyan ng ibang estilo ang aktibong link. Maaari mong gawin ito sa pamamagitan ng paglagay ng mga wrapper tag tulad ng makikita sa ibaba.
$config['cur_tag_open'] = '<span class="curlink">'; $config['cur_tag_close'] = '</span>';
At sa parehas na paraan, maaari mo din i-wrap ang mga digit link na tulad ng:
$config['num_tag_open'] = '<span class="numlink">'; $config['num_tag_close'] = '</span>';
At dito nagtatapos ang kwento ng customization. Sa katunayan, maaari mong tingnan ang mga halimbawa ng customization sa http://your-code-igniter-site/paging/custom na kasama na din sa ating controller file!
Ang pagination configuration
Ngayon alam mo na ang configuration na kinakailangan upang maset-up ang isang disenteng pagination gamit ang kahit na anong model listing. At kadalasan, mas nanaisin mo na panatilihin ang ganitong ayos sa buong site. Ano ang dapat mong gawin para magawa ito? Ikaw ay maaaring matuksong gayahin ang configuration code at i-paste ito sa bawat action na nangangailangan ng pagination configuration.
Sa katunayan, may mas mainam na paraan kung
paano harapin ang ganitong sitwasyon. Maaari kang gumawa ng paging
configuration file atapplication/config/pagination.php
at gamitin ang $config
variable para tukuyin ang iyong mga setting.
<?php $config['per_page'] = 10; $config["uri_segment"] = 3; $config['full_tag_open'] = '<div class="pagination">'; $config['full_tag_close'] = '</div>'; $config['first_link'] = 'First Page'; $config['first_tag_open'] = '<span class="firstlink">'; $config['first_tag_close'] = '</span>'; $config['last_link'] = 'Last Page'; $config['last_tag_open'] = '<span class="lastlink">'; $config['last_tag_close'] = '</span>'; $config['next_link'] = 'Next Page'; $config['next_tag_open'] = '<span class="nextlink">'; $config['next_tag_close'] = '</span>'; $config['prev_link'] = 'Prev Page'; $config['prev_tag_open'] = '<span class="prevlink">'; $config['prev_tag_close'] = '</span>'; $config['cur_tag_open'] = '<span class="curlink">'; $config['cur_tag_close'] = '</span>'; $config['num_tag_open'] = '<span class="numlink">'; $config['num_tag_close'] = '</span>';
Batay sa nabanggit, ganito dapat makikita
ang index
action method:
public function index() { // load db and model $this->load->database(); $this->load->model('Users'); // init params $params = array(); $start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0; $total_records = $this->Users->get_total(); // load config file $this->config->load('pagination', TRUE); $settings = $this->config->item('pagination'); $settings['total_rows'] = $this->Users->get_total(); $settings['base_url'] = base_url() . 'paging/config'; if ($total_records > 0) { // get current page records $params["results"] = $this->Users->get_current_page_records($settings['per_page'], $start_index); // use the settings to initialize the library $this->pagination->initialize($settings); // build paging links $params["links"] = $this->pagination->create_links(); } $this->load->view('user_listing', $params); }
Siyempre, ang total_rows
at base_url
na mga variable ay
nagbabago sa bawat aksyon na iyong gagawin, kaya nararapat lamang na i-set ito
nang maayos.
Para magawa ito, sa una pa lang kailangan mo ng i-load ang pagination configuration.
$this->config->load('pagination', TRUE); $settings = $this->config->item('pagination');
Pagkatapos, i-override ang mga action specific setting.
$settings['total_rows'] = $this->Users->get_total(); $settings['base_url'] = base_url() . 'paging/config';
At ikaw ay natapos din!
At iyan ang kwento ng pagination configuration, at dito din nagtatapos ang artikulong ito!
Ang Konklusyon
Ngayon, tinalakay natin ang pagination library sa CodeIgniter.
Sa unang bahagi ng arikulong ito, ipinakita ko sa inyo kung paano gamitin ang pagination library sa pamamagitan ng paggamit ng simple ngunit kapaki-pakinabang na halimbawa.
Sumunod dito, tinalakay din natin ang mga opsyon para sa customization na maaari mong gamitin habang inaayos ang pagination.
At sa huling bahagi, pinag-usapan natin ang
pagination configuration.
Ang CodeIgniter ay isang makapangyarihang PHP platform. Kung ikaw man ay nagsisimula pa lamang o nagsisimula ng bagong bersiyon, huwag kalimutang i-tsek kung ano pa ang maaari mong gamitin.
Nais kong malaman ang inyong mga katugunan sa pamamagitan ng mga tanong at mga komento gamit ang feed sa ibaba!
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weekly