Khanh Hoang - Kenn
Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.
Trong các bài viết trước tôi có trình bày về các kiểu truy vấn CSDL và phân trang dữ liệu . Trong bài viết này , tôi sẽ hướng dẫn các bạn cách tìm kiếm và phân trang dựa trên dữ liệu vừa tìm được .
CREATE TABLE `books` ( `id` int(11) NOT NULL AUTO_INCREMENT, `isbn` varchar(13) NOT NULL, `title` varchar(64) NOT NULL, `description` text NOT NULL, PRIMARY KEY (`id`) ); -- ---------------------------- -- Records -- ---------------------------- INSERT INTO `books` VALUES ('2', 'c,c++', 'Lập trình C', 'Lap trinh C can ban'); INSERT INTO `books` VALUES ('3', 'C++', 'Cấu trúc dữ liệu và giả thuật', 'Cau truc du lieu va giai thuat'); INSERT INTO `books` VALUES ('4', 'php', 'PHP căn bản', 'php, lap trinh php'); INSERT INTO `books` VALUES ('5', 'php nc', 'PHP Nâng cao', 'php,php nang cao'); INSERT INTO `books` VALUES ('6', 'php fw', 'PHP Framework', 'php, php framework'); INSERT INTO `books` VALUES ('22', 'abc', 'Lập trình ứng dụng web tập I', 'Lập trình ứng dụng web tập I'); INSERT INTO `books` VALUES ('24', 'abc', 'Lập trình ứng dụng web tập II', 'abc'); INSERT INTO `books` VALUES ('26', 'abc', 'Lập trình web với CakePHP', 'abc'); INSERT INTO `books` VALUES ('27', 'acb', 'Lập trình web với CodeIgniter', 'abc'); INSERT INTO `books` VALUES ('28', 'abc', 'Tutorial covered by Thái Thanh Phong ^0^', 'abc'); INSERT INTO `books` VALUES ('30', '', 'Kĩ thuật lập trình', '');
Vào app/controllers/ tạo Book Controller : books_controller.php
class BooksController extends AppController{ var $name = "Books";// ten cua Controller Book var $helpers = array('Form','Paginator','Html','Javascript','Common'); var $components = array('Session','RequestHandler','Common'); var $paginate = array(); function search() { // the page we will redirect to $url['action'] = 'result'; // build a URL will all the search elements in it // the resulting URL will be // example.com/cake/posts/index/Search.keywords:mykeyword/Search.tag_id:3 foreach ($this->data as $k=>$v){ foreach ($v as $kk=>$vv){ $url[$k.'.'.$kk]=$vv; } } // redirect the user to the url $this->redirect($url, null, true); } function result(){ $conditions = array(); $data = array(); if(!empty($this->passedArgs)){ //Fillter title if(isset($this->passedArgs['Book.title'])) { $title = $this->passedArgs['Book.title']; $conditions[] = array( 'Book.title LIKE' => "%$title%", ); $data['Book']['title'] = $title; } //Fillter description if(isset($this->passedArgs['Book.description'])) { $keywords = $this->passedArgs['Book.description']; $conditions[] = array( "OR" => array( 'Book.description LIKE' => "%$keywords%", 'Book.isbn LIKE' => "%$keywords%" ) ); $data['Book']['description'] = $keywords; } //Limit and Order By $this->paginate= array( 'limit' => 4, 'order' => array('title' => 'desc'), ); $this->data = $data; $this->set("posts",$this->paginate("Book",$conditions)); } } }
Ghi chú :
$this->data = $data;
Giữ lại giá trị tìm kiếm trên form tìm kiếm.
Trong Book Controller có 2 hàm chính là : search() và result()
- hàm result() : vụ hiển thị form search và hiển thị phân trang dữ liệu
- hàm search() : nhận request từ form và chuyển dữ liệu lại cho result() .
Vào app/views/books/ tạo file result.ctp :
<?php $this->Paginator->options(array('url' => $this->passedArgs)); ?> <?php echo $this->Form->create('Book',array('action'=>'search'));?> <fieldset> <legend><?php __('Book Search');?></legend> <?php echo $this->Form->input('title'); echo $this->Form->input('description'); echo $this->Form->submit('Search'); ?> </fieldset> <?php echo $this->Form->end();?> <?php if(!empty($posts)){ echo "<table>"; echo "<tr>"; echo "<th>".$this->Paginator->sort("Id","id"); echo "<th>".$this->Paginator->sort("Title","title"); echo "<th>".$this->Paginator->sort("Description","description"); echo "</tr>"; foreach($posts as $item){ echo "<tr>"; echo "<td>".$item['Book']['id']."</td>"; echo "<td>".$item['Book']['title']."</td>"; echo "<td>".$item['Book']['description']."</td>"; echo "</tr>"; } echo "</table>"; //---- Paging echo $this->Paginator->prev('« Previous ', null, null, array('class' => 'disabled')); //Shows the next and previous links echo " | ".$this->Paginator->numbers()." | "; //Shows the page numbers echo $this->Paginator->next(' Next »', null, null, array('class' => 'disabled')); //Shows the next and previous links echo " Page ".$this->Paginator->counter(); // prints X of Y, where X is current page and Y is number of pages } ?>
Trong phần file view này có vào hàm kha hay đó là :
echo "<th>".$this->Paginator->sort("Id","id"); echo "<th>".$this->Paginator->sort("Title","title"); echo "<th>".$this->Paginator->sort("Description","description"); $this->Paginator->sort("tên hiểu thị","tên_field")
Hàm này có chức năng hiển thị tên filed thông qua 1 dòng text nào đó , khi bấm vào thì danh sách dữ liệu sẽ tự sắp sếp tăng dần, bấm lần nữa thì tự giảm dần . Nó giống dạng sort table.
http://localhost/cakephp/books/search nó tự chuyển sang http://localhost/cakephp/books/result
Kết quả tìm kiếm với từ khóa : php và abc được 1 kết quả
Search thử với từ khóa "a" để có dữ liệu nhiều hơn cho việc phân trang :
Bài viết tham khảo tại :
- http://mrphp.com.au/code/search-forms-cakephp
- http://book.cakephp.org/view/1030/Co...ind-Conditions
Source code demo gồm các file sau :