-----
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++;
?> </td>
<td>
<?php if
($category['Category']['parent_id'] != null): ?>
+
<?php endif ?>
<?php
echo h($category['Category']['name']); ?>
</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
-----------