-----
Phần x43. CakePHP2
– Tree behavior
Xem (clip số 43a – chickenrainshop):
- Sử dụng tree behavior để tạo danh mục phân cấp
(43a) (3":51)
- Sử dụng recover để xây dựng dữ liệu cho parent,
children (4":35)
- Sử dụng select box (8":03)
- generateTreeList (9":09)
Thêm các trường parent_id, lft và rght cho bảng categories:
alter table categories
add parent_id int default null after id,
add lft int default null after parent_id,
add rght int default null after lft;
Khai báo sử dụng tree behavior trong model Category:
[Model\Category.php]
class Category extends AppModel {
public $actsAs =
['Tree'];
Đọc thêm về TreeBehavior: https://book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html
Sử dụng hàm recover() của tree behavior để thêm dữ liệu cho
các trường parent_id, lft, rght trong bảng categories:
[Controller\CategoriesController.php]
public function admin_index() {
//$this->layout
= 'admin';
$this->Category->recover();
$this->Category->recursive
= -1;
Sửa lại giao diện của form ‘thêm danh mục sách’ (New
Category), để cho phép người dùng nhập vào giá trị của trường parent_id khi
thêm một danh mục sách mới.
[View\Categories\admin_add.ctp]
<div
class="input">
<?php echo
$this->Form->select('parent_id'); ?>
</div>
<?php
echo
$this->Form->input('name');
Đưa dữ liệu vào trường parent_id trên view:
[Controller\CategoriesController.php]
public function admin_add() {
if
($this->request->is('post')) {
$this->Category->create();
if
($this->Category->save($this->request->data)) {
$this->Flash->success(__('The
category has been saved.'));
return
$this->redirect(array('action' => 'index'));
}
else {
$this->Flash->error(__('The
category could not be saved. Please, try again.'));
}
}
// sinh ra một cấu trúc cây
$categories =
$this->Category->generateTreeList();
$this->set('categories', $categories);
}
Sửa lại một chút [View\Categories\admin_add.ctp]
<div class="input">
<?php
echo $this->Form->select('parent_id', $categories, ['empty' => '--Chọn danh mục--']); ?>
</div>
Thực hiện thêm trường parent_id trên view admin_edit:
[View\Categories\admin_edit.ctp]
<div
class="input">
<?php echo
$this->Form->select('parent_id', $categories, ['empty' => '--Chọn danh
mục--']); ?>
</div>
<?php
echo
$this->Form->input('id');
[Controller\CategoriesController.php]
public function admin_edit($id = null) {
if
(!$this->Category->exists($id)) {
throw
new NotFoundException(__('Invalid category'));
}
if
($this->request->is(array('post', 'put'))) {
if
($this->Category->save($this->request->data)) {
$this->Flash->success(__('The
category has been saved.'));
return
$this->redirect(array('action' => 'index'));
}
else {
$this->Flash->error(__('The
category could not be saved. Please, try again.'));
}
}
else {
$options
= array('conditions' => array('Category.' . $this->Category->primaryKey
=> $id));
$this->request->data
= $this->Category->find('first', $options);
}
// sinh ra một cấu trúc cây
$categories =
$this->Category->generateTreeList();
$this->set('categories', $categories);
}
-----------
Cập nhật 24/7/2017
-----------