Ngu ngơ học làm web (x48) - CakePHP2 - Hàm end(), upload và xóa tập tin

Tiếp theo của: Ngu ngơ học làm web (x47) - CakePHP2 – Xóa folder, upload tập tin, upload ảnh
-----

Phần x48. CakePHP2 – Hàm end(), upload và xóa tập tin


Xem (clip số 46b – chickenrainshop):

- Lấy phần mở rộng của một file, hàm explode (46b)(2":17)

- Hàm end (3":04)

Đổi tên tập tin hình ảnh khi upload lên server để tránh ghi đè vào các tập tin đã có sẵn trước đó, tên của tập tin hình ảnh chính là slug của cuốn sách.

Chỉnh sửa hàm uploadFile().

[BooksController.php]

private function uploadFile($folder = null) {
                        $file = new File($this->request->data['Book']['image']['tmp_name']);
                        $arr = explode('.', $this->request->data['Book']['image']['name']);
                        $ext = end($arr);
                        $fileName = $this->request->data['Book']['slug'].'.'.$ext;
                        if ($file->copy(APP.'webroot/files/'.$folder.'/'.$fileName)) {
                                    $result = [
                                                'status' => true,
                                                'fileName' => $fileName
                                    ];
                        } else {
                                    $result = [
                                                'status' => false,
                                                'fileName' => $fileName
                                    ];
                        }
                        return $result;
            }

Sửa lại action admin_edit()

[BooksController.php]

public function admin_edit($id = null) {
                        …
                                    if (!empty($this->request->data['Book']['image']['name'])) {
                                                $result = $this->uploadFile($category['Category']['slug']);
                                                if ($result['status']) {
                                                $location = '/files/'.$category['Category']['slug'].'/'.$result['fileName'];
                                                            $this->request->data['Book']['image'] = $location;
                                                …
            }

Xem (clip số 46c – chickenrainshop):

Cho phép upload tập tin hình ảnh trong view ‘thêm một cuốn sách’ (Add Book).

[View\Books\admin_add.ctp]
<div class="books form">
<?php echo $this->Form->create('Book', ['type' => 'file']); ?>
            <fieldset>
                        <legend><?php echo __('Add Book'); ?></legend>
            <?php
                        echo $this->Form->input('category_id');
                        echo $this->Form->input('title');
                        echo $this->Form->input('slug');
                        echo $this->Form->input('image', ['type' => 'file']);

[BooksController.php]

public function admin_add() {
                        if ($this->request->is('post')) {
                                    $this->checkSlug($this->request->data, 'Book', 'title');
                                    $this->loadModel('Category');
                                    $category = $this->Category->findById($this->request->data['Book']['category_id']);
                                    $result = $this->uploadFile($category['Category']['slug']);
                                    if ($result['status']) {
                                                $location = '/files/'.$category['Category']['slug'].'/'.$result['fileName'];
                                                $this->request->data['Book']['image'] = $location;
                                                $this->Book->create();
                                                if ($this->Book->save($this->request->data)) {
                                                            $this->Flash->success(__('The book has been saved.'));
                                                            return $this->redirect(array('action' => 'index'));
                                                } else {
                                                            $this->Flash->error(__('The book could not be saved. Please, try again.'));
                                                }
                                    } else {
                                                $this->Flash->error(__('Bạn chưa upload hình ảnh cho sách!'));
                                    }
                                   
                        }
                        $categories = $this->Book->Category->generateTreeList();
                        $writers = $this->Book->Writer->find('list');
                        $this->set(compact('categories', 'writers'));
            }

Thực hiện xóa tập tin hình ảnh:

[BooksController.php]

Thêm prefix admin vào trước action delete.

public function admin_delete($id = null) {

Thay đổi nội dung bên trong action admin_delete():

[BooksController.php]

public function admin_delete($id = null) {
                        $this->Book->id = $id;
                        if (!$this->Book->exists()) {
                                    throw new NotFoundException(__('Invalid book'));
                        }
                        $this->request->allowMethod('post', 'delete');
                        $book = $this->Book->findById($id);
                        $file = new File(APP.'/webroot/'.$book['Book']['image']);
                        if ($file->delete()) {
                                    if ($this->Book->delete()) {
                                                $this->Flash->success(__('The book has been deleted.'));
                                    } else {
                                                $this->Flash->error(__('The book could not be deleted. Please, try again.'));
                                    }
                        } else {
                                    $this->Flash->error(__('Không xóa được file hình ảnh, vui lòng thử lại sau!'));
                        }
                        return $this->redirect(array('action' => 'index'));

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