-----
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
-----------