Ngu ngơ học làm web (x18) - CakePHP2 - Gọi và gửi biến giữa các action

Tiếp theo của: Ngu ngơ học làm web (x17) - CakePHP2 – Search trên hai table, paginate, validate
-----

Phần x18. CakePHP2 – Gọi và gửi biến giữa các action


Xem (clip số 22c – chickenrainshop):

- Lấy keyword của form tìm kiếm (3":18)

- Lấy giá trị của một biến gửi từ các function khác nhau trong cùng controller (7":32)

- request->params hoặc request->passedArgs

- Gửi lại từ khóa tìm kiếm lên form (14":40)

Ý tưởng của phần này là:

- Khi người dùng submit, dữ liệu của form được gửi về action get_keyword

- Action get_keyword sẽ kiểm tra dữ liệu, lưu lại lỗi của việc kiểm tra dữ liệu (nếu nó)

- Trong action get_keyword, gọi action search và gửi biến keyword cho action search, sử dụng câu lệnh sau: $this->redirect(['action' => 'search', 'keyword' => $keyword]);  

- Trong action search, sử dụng $this->request->params hoặc $this->passedArgs để lấy giá trị của biến keyword do action get_keyword gửi tới.

Lưu lại đoạn mã để tham khảo:

[action get_keyword() trong BooksController.php]

public function get_keyword() {
                        if ($this->request->is('post')) {
                                    $this->Book->set($this->request->data);
                                    if ($this->Book->validates()) {
                                                $keyword = $this->request->data['Book']['keyword'];
                                    } else {
                                                $errors = $this->Book->validationErrors;
                                                $this->Session->write('search_validation', $errors);
                                    }
                                    $this->redirect(['action' => 'search', 'keyword' => $keyword]);                  
                        }
            }

[action search() trong BooksController.php]

public function search() {
                        $notFound = false;
                        if ($this->Session->check('search_validation')) {
                                    $this->set('errors', $this->Session->read('search_validation'));
                                    $this->Session->delete('search_validation');
                        }
                        if (!empty($this->params['named']['keyword'])) {
                                    $keyword = $this->params['named']['keyword'];
                                    $this->paginate = [
                                                            'fields' => ['title', 'image', 'sale_price', 'slug'],
                                                            // 'contain' => ['Writer.name', 'Writer.slug'],
                                                            'contain' => ['Writer' => ['name', 'slug']],
                                                            'order' => ['Book.created' => 'desc'],
                                                            'limit' => 2,
                                                            'conditions' => [
                                                                        'published' => 1,
                                                                        'or' => [
                                                                                    'title like' => '%'.$keyword.'%',
                                                                                    'w.name like' => '%'.$keyword.'%'
                                                                                    ]
                                                                        ],
                                                            'joins' => [
                                                                        [
                                                                                    'table' => 'books_writers',
                                                                                    'alias' => 'bw',
                                                                                    'conditions' => 'bw.book_id = Book.id'
                                                                        ],
                                                                        [
                                                                                    'table' => 'writers',
                                                                                    'alias' => 'w',
                                                                                    'conditions' => 'bw.writer_id = w.id'
                                                                        ]
                                                            ]
                                                ];
                                    $books = $this->paginate('Book');
                                    if (!empty($books)) {
                                                $this->set('results', $books);
                                    } else {
                                                $notFound = true;
                                    }
                                    $this->set('keyword', $keyword);
                        }          
                        $this->set('notFound', $notFound);
            }

[search.ctp]

<?php echo $this->Form->create('Book', ['url' => ['action' => 'get_keyword'],'novalidate' => true]) ?>
            <?php if (isset($keyword)): ?>
                        <?php echo $this->Form->input('keyword',
                        [
                                    'label' => '',
                                    'placeholder' => 'Nhập từ khóa tìm kiếm...',
                                    'error' => false,
                                    'required' => false,
                                    'value' => $keyword
                        ]);
                        ?>      
            <?php else: ?>
                        <?php echo $this->Form->input('keyword',
                        [
                                    'label' => '',
                                    'placeholder' => 'Nhập từ khóa tìm kiếm...',
                                    'error' => false,
                                    'required' => false
                        ]);
            ?>
            <?php endif ?>
           
            <?php if (isset($errors)): ?>
                        <?php foreach ($errors as $error): ?>
                                    <?php echo $error[0]; ?>
                        <?php endforeach ?>
            <?php endif ?>
            <?php if (isset($results) && $notFound == false): ?>
                        Kết quả tìm kiếm của từ khóa <strong><?php echo $keyword; ?></strong> <br>
                        <?php echo $this->element('book', ['books' => $results]); ?>
                        <?php echo $this->element('pagination', ['object' => 'quyển sách']); ?>
            <?php elseif($notFound == true): ?>
                        Không tìm thấy quyển sách này!
            <?php endif ?>

<?php echo $this->Form->end('Search'); ?>

-----------
Cập nhật 18/5/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web