Hướng dẫn học : Tìm Kiếm và phân trang dữ liệu với CakePHP

Hướng dẫn học : Tìm Kiếm và phân trang dữ liệu với CakePHP

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 .

1.Tạo CSDL :

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', '');

2.Viết ứng dụng :

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.

3.Chạy thử ví dụ :

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 :

  • Controllers/books_controller.php
  • Views/result.ctp
  • Models/book.php
  • books.sql
Tags: 
Bạn thấy bài viết này như thế nào?: 
No votes yet
Ảnh của Khanh Hoang

Khanh Hoang - Kenn

Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Phần 1: Giới thiệu Composer in contrib

Phần 1: Giới thiệu Composer in contrib

 Add a composer.json file to your Drupal 8 module. The example below gives everything you need.

Trải nghiệm Máy tính Rosa Intel NUC: hoàn hảo cho gia đình

Trải nghiệm Máy tính Rosa Intel NUC: hoàn hảo cho gia đình

ROSA Intel NUC là dòng sản phẩm PC nhỏ gọn hướng đến đối tượng người dùng có nhu cầu văn phòng

Đề xuất phương án doanh nghiệp tự quyết định giá nước sạch

Luật Thoát nước và Xử lý nước thải sẽ được ban hành sau năm 2020

Theo bà Mai Thị Liên Hương, Bộ Xây dựng đang định hướng xây dựng một số chính sách mới trong quản lý cấp nước như quy định người dân có quyền được tiếp cận nước sạch 

Công ty diệt chuột T&C

 

Diet con trung