Ở bài trước chúng ta đã tìm hiểu qua phân trang dữ liệu trong CakePHP, và ở bài này ta cùng tìm hiểu về việc tìm kiếm kết hợp với phân trang trong framework mới này, việc tìm kiếm rồi phân trang dữ liệu tìm được là một phần không thể thiếu trong khi lập trình website.

Yêu cầu đã đọc qua bài 6: Phân trang dữ liệu

Phần 1: Chuẩn bị cơ sở dữ liệu: chúng ta sẽ sử dụng lại table books, và các dữ liệu đã có trong table này.

Phần 2: Tạo ứng dụng

Chúng ta vẫn sử dụng project cũ cakephp, các file model, view, controller đã tạo ở các bài trước chúng ta sẽ sửa lại nội dung để phù hợp với yêu cầu này.

  • Về model Book.php chúng ta sẽ giữ nguyên
  • Về file BooksController.php như sau:

<?php
class BooksController extends AppController{
    public $name = "Books";
    public $helpers = array('Form','Paginator','Html');
    public $paginate = array();

    function view(){
       $conditions = array();
       $data = array();
       if(!empty($this->passedArgs)){
         if(isset($this->passedArgs['Book.title'])) {//kiểm tra xem có tồn tại title hay không
           $title = $this->passedArgs['Book.title'];
           $conditions[] = array( 'Book.title LIKE' => "%$title%", );//điều kiện SQL
           $data['Book']['title'] = $title;//cho giá trị nhập vào mảng data
         }
         if(isset($this->passedArgs['Book.description'])) {
           $description = $this->passedArgs['Book.description'];
           $conditions[] = array( "OR" => array( 'Book.description LIKE' => "%$description%" ) );
           $data['Book']['description'] = $description;
         }
         $this->paginate= array( 'limit' => 2, 'order' => array('id' => 'desc'), );
         $this->data = $data;//Giữ lại giá trị nhập vào sau khi submit
         $post = $this->paginate("Book",$conditions);
         $this->set("posts",$post);
      }
    }
    function search() {
       $url['action'] = 'view';
       foreach ($this->data as $key=>$value){
          foreach ($value as $key2=>$value2){
            $url[$key.'.'.$key2]=$value2;
          }
       }
       $this->redirect($url, null, true);//dùng để chuyển hướng sang action view
    }
}

Giải thích: 


public $helpers = array('Form','Paginator','Html');

»   Khi sử dụng view thì nên khai báo thêm helpers “Html”, trong form có cần submit form thì thêm helpers “Form”, có phân trang thì có helpers “Paginator”.

»   Trong file BooksController.php có 2 hàm là view(), và search():

  1. Hàm view() tương ứng với file view.ctp bên dưới hiển thị form và phân trang dữ liệu.
  2. Hàm search() chính là action trong form của view.ctp có tác dụng nhận dữ liệu từ form submit và chuyển dữ liệu lại cho view()
  • Về file view.ctp nội dung như sau:
<html>
<title></title>
<body>
   <?php echo $this->Form->create('Book',array('action'=>'search'));?>
   <?php
    echo $this->Form->input('title');
    echo $this->Form->input('description');
    echo $this->Form->submit('Search');
   ?>
   <?php echo $this->Form->end();?>
   <?php $this->Paginator->options(array('url' => $this->passedArgs)); ?>
   <!--Hiển thị dữ liệu sau khi tìm kiếm-->
   <?php if(!empty($posts)){?>
   <table>
    <tr>
    <th><?php echo $this->Paginator->sort("id","Id");?></th>
    <th><?php echo $this->Paginator->sort("title","Tiêu đề");?> </th>
    <th><?php echo $this->Paginator->sort("description","Nội dung");?></th>
    </tr>
   <?php
    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>";
    }
   ?>
   </table>
 <?php
   echo $this->Paginator->prev('« Previous ', null, null, array('class' => 'disabled'));
   echo " | ".$this->Paginator->numbers()." | ";
   echo $this->Paginator->next(' Next »', null, null, array('class' => 'disabled'));
 } ?>
</body>
</html>

Giải thích:

  1. Hàm $this->Paginator->sort(“tên field trong db”,”text hiển thị lên view”) nó sẽ hiển thị lên view đoạn text tương ứng với cột trong database, khi click vào sẽ sắp xếp theo dạng tăng dần hoặc giảm dần.
  2. File có đoạn :
<?php echo $this->Form->create('Book',array('action'=>'search'));?>
<?php
echo $this->Form->input('title');
echo $this->Form->input('description');
echo $this->Form->submit('Search');
?>
<?php echo $this->Form->end();?>

đây là cách mà cakephp tạo ra các html tương ứng với kiểu dữ liệu trong table books

Phần 3: chạy ứng dụng

Tiến hành chạy ứng dụng url là http://localhost:8080/cakephp/books/search

2015-10-01_165758

 

Các bạn thử tìm kiếm với các thử khóa và xem kết quả nhá, thêm cái nữa là nhấp vào các tên của tiêu đề để sắp xếp lại theo thứ tự tăng dần hoặc giảm dần.

Các bạn có thể download 2 file BooksController.php và view.ctp bên dưới.

Kết luận

  1. Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
  2. Cảm ơn các bạn đã đọc.

Nongdanit.info
[Cakephp] Bài 7 – Tìm kiếm và phân trang dữ liệu