Jangan risau. Masalah ini satu kebiasaan.
Pagination dalam cakePHP sangat mudah. Cuma apabila membuat carian, hasilnya hanya ok pada mukasurat pertama dan apabila pergi ke mukasurat seterusnya paparan adalah senarai biasa yang tiada filter berdasarkan carian.
Untuk artikel ini, katakan kita ada table states yang menyimpan senarai negeri dalam Malaysia. Carian akan dijalankan terhadap kandungan table states itu.
--
-- Table structure for table `states`
--
CREATE TABLE IF NOT EXISTS `states` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
--
-- Dumping data for table `states`
--
INSERT INTO `states` (`id`, `name`) VALUES
(1, 'Johor'),
(2, 'Kedah'),
(3, 'Kelantan'),
(4, 'Melaka'),
(5, 'Negeri Sembilan'),
(6, 'Pahang'),
(7, 'Perak'),
(8, 'Perlis'),
(9, 'Pulau Pinang'),
(10, 'Sabah'),
(11, 'Sarawak'),
(12, 'Selangor'),
(13, 'WP Kuala Lumpur'),
(14, 'WP Labuan'),
(15, 'WP Putrajaya'),
(16, 'Terengganu');
*Macamlah korang perlu SQL untuk table mudah ni :) *
Gunakan Bake untuk jana kod asas untuk tutorial ini. File-file yang dijanakan oleh cakephp:
app/
controllers/states_controller.php
models/state.php
views/states/
index.ctp
add.ctp
edit.ctp
view.ctp
Taipkan form carian untuk pengguna kita membuat carian. Form ini cuma perlu satu input jenis text untuk menerima keyword carian dan satu button submit untuk menghantar carian kepada applikasi kita. Form ini akan menghantar keyword carian user kepada function search (kita akan kodkan function ini sebentar lagi).
Buka file views/states/index.ctp dan masukkan kod carian ini dimana-mana yang anda fikir cantik dan sesuai.
<fieldset>
<legend>Search</legend>
<?php
echo $this->Form->create('State', array('controller' => 'states', 'action' => 'search','type'=>'get'));
echo $this->Form->input('carian', array( 'name'=>'keyword_carian' ));
echo $this->Form->end();
?>
</fieldset>
Jangan lupa letak 'type' => 'get', ini akan memasukkan keyword carian itu pada url.
Buka pula file controllers/states_controller.php dan tambahkan kod berikut
class StatesController extends AppController {
//.... macam2 kod kat sini
function search(){
$url['action'] = 'index';
$url['keyword_carian'] = $this->params['url']['keyword_carian'];
$this->redirect($url, null, true);
}
//.... macam2 kod kat sini
}
Function search ini akan menerima keyword_carian daripada form carian yang kita buatkan tadi. Perhatikan apa yang kita hantar daripada form itu tidak masuk ke dalam $this->data seperti kebiasaannya kerana pada form itu kita menamakan input itu (cari 'name' => 'keyword_carian' pada form) dan juga kerana kita menggunakan method GET untuk menghantar form.
Akhirnya, function ini akan redirect kepada index dan membentuk url seperti http://localhost/applikasikita/states/index/keyword_carian:apaygdicari
index itu ditentukan oleh $url['action'] = 'index' dan keyword_carian mempunyai nilai carian carian yang user masukkan.
Ubahsuai function index dalam controller menjadikannya seperti berikut:
function index() {
$this->State->recursive = 0;
$this->paginate = array(
'limit' => 2, );
if(isset($this->params['named']['keyword_carian'])){
$this->paginate['conditions'] = array(
'State.name LIKE ' => "%" . $this->params['named']['keyword_carian'] ."%"
);
}
$this->set('states', $this->paginate());
} }
Disini kita dapat lihat contoh penggunaan
1. named parameter. Ini dijana daripada $this->redirect daripada function search(). Ini penting kerana apa yang ada pada url itu disimpan dalam variable cakephp dan ini ada pelbagai guna termasuk untuk pagination kita ini.
2. Memberi option kepada pagination termasuk membuat syarat carian (query).
3. query LIKE. Dalam contoh ini, query ini tidak digalakkan kerana ada '%' pada awal dan akhir keyword carian. Carian seperti ini boleh jadi lembab kalau rekod banyak.
Pada line pertama file app/views/index.ctp itu masukkan code ini:
<?php
$this->Paginator->options(array(
'url' => $this->passedArgs ));
?>
Ini akan memberitahu paginator kita supaya mengekalkan apa yang kita hantar melalui url dalam membentuk link paginator untuk ke page lain. Ini termasuk keyword_carian kita tadi itu.
Maka dengan itu selesai sudah tutorial ini. Harapnya apa yang saya masukkan disini dapat membantu. Kod ditutorial ini pun saya ubahsuai dari sistem yang saya buat dan tak test untuk tujuan tutorial ini. Kalau ada error, sila emailkan kepada saya di zam3858_di_gmail_dork_com untuk saya test dan baiki. Kalau saya sempat, saya akan tambahkan disqus commenting system pada blog ini untuk dapatkan feedback.
TQ.