Ngu ngơ học làm web (x44) - CakePHP2 - Dependent, confirm, moveUp, moveDown

Tiếp theo của: Ngu ngơ học làm web (x43) - CakePHP2 – Tree behavior
-----

Phần x44. CakePHP2 – Dependent, confirm, moveUp, moveDown


Xem (clip số 43b – chickenrainshop):

- Hiển thị dữ liệu dạng cây (43b)

- Hàm removeFromTree để xóa dữ liệu (4":03)

- Làm việc với quan hệ hasMany, dependent (6":42)

- Chuyển danh mục lên/xuống một bậc (10":08)

- Hàm exists, moveUp, moveDown (11":13)

Hiển thị các danh mục sách theo kiểu phân cấp trong view admin_index:

Ý tưởng là sắp xếp lại các danh mục sách tăng dần theo giá trị của trường lft.

[Controller\CategoriesController.php]

public function admin_index() {
                        $this->paginate = [
                                    'order' => ['lft' => 'asc']
                        ];
                        $this->Category->recursive = -1;
                        $this->set('categories', $this->Paginator->paginate());
            }

Chỉnh lại phần hiển thị một chút:

[admin_index.ctp]

<thead>
            <tr>
                                    <th><?php echo 'STT'; ?></th>
                                    <th><?php echo $this->Paginator->sort('name'); ?></th>
<tbody>
            <?php $i = 1; ?>
            <?php foreach ($categories as $category): ?>
            <tr>
                        <td><?php echo $i++; ?>&nbsp;</td>
                        <td>
                                    <?php if ($category['Category']['parent_id'] != null): ?>
                                                +
                                    <?php endif ?>
                                    <?php echo h($category['Category']['name']); ?>&nbsp;
                        </td>

Thay hàm delete() bằng hàm removeFromTree():

[CategoriesController.php action admin_delete()]

$this->request->allowMethod('post', 'delete');
                        if ($this->Category->removeFromTree($id, true)) {
                                    $this->Flash->success(__('The category has been deleted.'));

Khi thực hiện xóa một Category, để xóa luôn các Book và Comment liên quan, cần cấu hình thông tin về dependent trong model.

[Model\Category.php]

public $hasMany = array(
                        'Book' => array(
                                    …
                                    'dependent' => true,
                                    …
                        )
            );

[Model\Book.php]

public $hasMany = array(
                        'Comment' => array(
                                    …
                                    'dependent' => false,
                                    …
                        )
            );

Cách xuất một câu thông báo yêu cầu người dùng xác nhận (confirm):

<?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $category['Category']['id']), array('confirm' => __('Bạn có đồng ý xóa tất cả cuốn sách trong danh mục %s hay không?', $category['Category']['name']))); ?>

Thực hiện di chuyển một nút trong cây, chuyển lên:

[admin_index.ctp]

<td class="actions">
            <?php echo $this->Form->postlink('Lên', ['controller' => 'categories', 'action' => 'up', $category['Category']['id']]); ?>
            <?php echo $this->Html->link(__('View'), array('action' => 'view', $category['Category']['id'])); ?>

Viết mã cho action up():

[CategoriesController.php]

public function admin_up($id = null) {
                        if ($this->request->is('post')) {
                                    $this->Category->id = $id;
                                    if ($this->Category->exists()) {
                                                $this->Category->moveUp($id, 1);
                                    }
                        }
                        $this->redirect($this->referer());
            }

Để ý là trường lft và rght thể hiện thứ tự của một nút trong cây, thực hiện moveUp rồi quan sát database để rõ hơn.

Viết tiếp cho chức năng moveDown:

[admin_index.ctp]

<?php echo $this->Form->postlink('Lên', ['controller' => 'categories', 'action' => 'up', $category['Category']['id']]); ?>
<?php echo $this->Form->postlink('Xuống', ['controller' => 'categories', 'action' => 'down', $category['Category']['id']]); ?>

Viết mã cho action down():

[CategoriesController.php]

public function admin_down($id = null) {
                        if ($this->request->is('post')) {
                                    $this->Category->id = $id;
                                    if ($this->Category->exists()) {
                                                $this->Category->moveDown($id, 1);
                                    }
                        }
                        $this->redirect($this->referer());

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