Ngu ngơ học làm web (x43) - CakePHP2 - Tree behavior

Tiếp theo của: Ngu ngơ học làm web (x42) - CakePHP2 – admin, route prefix, request->params
-----

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'];


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
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web