Chào các bạn! Trong phần 1 của chuỗi bài hướng dẫn học PHP trên CakePHP framework tôi đã trình bày một cách tổng quan cũng như bước đầu xây dựng một ứng dụng CakePHP. Trong thời gian qua nhận được khá nhiều phản hồi của các bạn tôi rất vui và cảm ơn các bạn, nay để đáp lại sự quan tâm đó tôi viết tiếp phần 2. Phần này tôi tiếp tục việc xây dựng ứng dụng tên là "CakeTooDoo" đang làm ở phần 1. Phần 2 sẽ có tên là "Tạo một form để thêm nhiệm vụ mới vào CakeTooDoo".
Như đã hướng dẫn trong phần 1 chúng ta đã tạo thiết kế chức năng hiển thị danh sách các nhiệm vụ cho ứng dụng CakeTooDoo. Trong phần này, tôi sẽ hướng dẫn các bạn cách tạo một form để thêm mới một nhiệm vụ và cập nhật vào cơ sở dữ liệu. Tôi chia làm 2 chương nhỏ:
I. Hướng dẫn tạo form thêm mới một nhiệm vụ (Task) trong ứng dụng "CakeTooDoo".
II. Giải thích chi tiết các bước làm trong chương I.
I. Tạo form thêm mới nhiệm vụ (task).
I. Tạo form thêm mới nhiệm vụ (task).
1. Mở file tasks_controller.php và thêm vào một hành động (action) mới có tên là “add” như sau:
function add() {
if (!empty($this->data)) {
$this->Task->create();
if ($this->Task->save($this->data)) {
$this->Session->setFlash('Nhiệm vụ(task) đã được lưu!');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('Nhiệm vụ chưa được lưu. Vui lòng thử lại!');
2. Cũng trong file file tasks_controller.php , trong lớp TasksController bạn thêm một mảng có tên là $helpers với giá trị như sau:
var $helpers = array('Html', 'Form');
Bây giờ file tasks_controller.php có dạng như sau:
<?php
class TasksController extends AppController{
var $name= 'Tasks';
var $helpers = array('Html', 'Form');
function index(){
$this->set('tasks',$this->Task->find('all'));
//Hàm find() để lấy các record từ bảng của Model
//Hàm set() gửi dữ liệu lấy được đến một mảng tên là tasks
}
function add() {
if (!empty($this->data)) {
$this->Task->create();
if ($this->Task->save($this->data)) {
$this->Session->setFlash('Nhiệm vụ(task) đã được lưu!');
$this->redirect(array('action'=>'index'), null, true);
} else {
$this->Session->setFlash('Nhiệm vụ chưa được lưu. Vui lòng thử lại!');
}
}
}
}
?>
3. Trong thư mục /CakeTooDoo/app/views/tasks tạo một file mới có tên là add.ctp và thêm đoạn code sau vào trong đó:
<?php echo $form->create('Task');?>
<fieldset>
<legend>Thêm mới nhiệm vụ (Task)</legend>
<?php
echo $form->input('title');
echo $form->input('done');
?>
</fieldset>
<?php echo $form->end('Add Task');?>
4. Bây giờ bạn mở trình duyệt web và gõ vào địa chỉ sau để kiểm tra : http://localhost/CakeTooDoo/tasks/add , lúc đó màn hình giao diện form thêm mới nhiệm vụ sẽ hiển thị như trong hình sau:
==> Và lúc này bạn đã có thể sử dụng form này để thêm mới một nhiệm vụ bằng cách nhập các thông tin và nhấn nút “Add Task”.
==> Và lúc này bạn đã có thể sử dụng form này để thêm mới một nhiệm vụ bằng cách nhập các thông tin và nhấn nút “Add Task”.
5. Bước tiếp theo tôi sẽ hướng dẫn cách tạo đường link chức năng Thêm mới nhiệm vụ và giao diện danh sách các nhiệm vụ (Đã làm trong phần 1).
- Trong file index.ctp ở thư mục /CakeTooDoo/app/views/ bạn thêm đoạn code sau vào dòng cuối cùng của file này (Bạn có thể tùy chỉnh vị trí mà bạn thích):
<?php echo $html->link('Add Task', array('action'=>'add')); ?>
6. Tương tự thêm một liên kết để xem danh sách tất cả các nhiệm vụ trong form “Thêm mới nhiệm vụ” bằng cách thêm đoạn code sau vào dòng cuối cùng của file add.ctp trong thư mục /CakeTooDoo/app/views/ :
<?php
echo $html->link('List All Tasks', array('action'=>'index'));
?>
Đến đây bạn đã hoàn thành việc tạo một form thêm mới nhiệm vụ và cập nhật nhiệm vụ đó xuống cơ sở dữ liệu.
II. Giải thích
Nãy giờ làm một lô một lốc chắc có nhiều bạn đặt câu hỏi là sao làm được vậy? Bây giờ tôi sẽ giải thích vì sao làm các bước như trên.
Chúng ta đã thêm mới hành động (Action) “Add” vào controller Tasks. Hành động này có thể được truy cập bằng đường dẫn : http://localhost/CakeTooDoo/tasks/add
Khi có một yêu cầu tới hành động này, đầu tiên nó sẽ kiểm tra bất kỳ dữ liệu nào có được truyền đi bằng phương thức POST không. Mọi dữ liệu được truyền bằng phương thức POST được tự động lưu trữ bởi CakePHP trong mảng $this->data của controller. Nếu không có dữ liệu POST nào được chỉ định, thì action không thực hiện gì cả, và view sẽ trả về một form “Thêm mới nhiệm vụ” rỗng. View sẽ tự động hiển thị sau khi action xử lý xong.
Khi nhấn submit, dữ liệu sẽ được truyền đi bằng phương thức POST, và được lưu vào $this->data. Khi đó, bó gọi hàm create() của model Task ,sử dụng: $this->Task->create(); . Hàm create() chuẩn bị cho model Task thêm hoặc chỉnh sửa dữ liệu. Sau đó, hàm save() được gọi, đây là hàm của Model Task để lưu dữ liệu vào cơ sở dữ liệu, cách thực hiện : $this->Task->save($this->data).
Nếu dữ liệu được lưu thành công, một thông báo hoàn thành được lưu trong session và trang chuyển hướng tới action index. Hành động index hiển thị danh sách các nhiệm vụ mới được thêm vào kèm theo thông báo thành công được lưu trong session. Nếu vì một nguyên nhân nào đó, dữ liệu chưa được lưu vào cơ sở dữ liệu , một thông báo lỗi cũng sẽ được lưu vào session, và form thêm mới nhiệm vụ sẽ được hiển thị lần nữa với thông báo lỗi.
Chúng ta cũng thêm HTML và các helper Form vào controller Tasks bằng cách thêm dòng code sau:
var $helpers = array(‘Html’,’Form’);
(Helper là các module đặc biệt của CakePHP, chúng cung cấp các hàm cần thiết trong các view để định dạng và chỉ ra dữ liệu cần thiết.)
Tiếp theo chúng ta sẽ tạo view cho action add bằng cách thêm file add.ctp vào thư mục /CakeTooDoo/apps/views/tasks. Trong file add.ctp , đầu tiên chúng ta sử dụng helper Form để tạo ra một form HTML để xác nhận dữ liệu cho model Tasks sử dụng đoạn code sau:
echo $form->create(‘Task’);
Thẻ Input HTML nhập vào Title và Status của một nhiệm vị được tạo bằng cách sử dụng:
echo $form->input(‘title’); và
echo $form->input(‘done’);
Tiếp theo , chúng ta thêm: echo $form->end(‘Add Task’); để đóng form và thêm một nút submit có nhãn là “Add Task”.
Cuối cùng, chúng ta liên kết đến index (Danh sách các nhiệm vụ) và thêm trang thêm mới nhiệm vụ bằng cách sử dụng helper HTML. Thêm $html->link(‘Add Task’, array(‘action’==> ‘add’)); và file index.ctp.
Trong phần 3 - Tôi sẽ hướng dẫn các bạn thiết kế chức năng sửa và xóa các nhiệm vụ.
bài viết rất bổ ích. Thank admin nhiều nhé! mong rằng admin sẽ nhanh chóng update phần 3 để cho mọi người tiếp tục học hỏi.
Trả lờiXóaMình đã theo dõi các bài viết của bạn. Bài viết rất hay. Nhưng phần 2 mình làm như bạn hướng dẫn nó báo lỗi Call to a member function link() on a non-object.
Trả lờiXóaCảm ơn bạn nhiều.
Trả lờiXóaCam on anh ve bai viet hay, toi la nguoi moi hoc cakephp nen ko ranh lam, cho hoi ti ve config cho nao de chay duoc duong dan: http://localhost/caketoodoo/tasks/index (toi chay link nay no bao Not Found
Trả lờiXóaThe requested URL /caketoodoo/tasks/index was not found on this server.)
Cam on admin nhieu!
Hi, toi co doi link:
Trả lờiXóahttp://localhost/caketoodoo/tasks/index
=> http://localhost/caketoodoo/index.php/tasks/index thi` chay duoc!
Cho hoi config cho nao de bo doan index.php ma van chay dc? Toi cam on!
Bạn kiểm tra và cấu hình lại webroot trong file .htaccess .
Trả lờiXóaBạn đang dùng phần mềm tạo localhost nào vậy?
Trong ni có một chỗ ko biết ghi sai hay nhầm:
Trả lờiXóaĐó là những đoạn code:
$form->...
phải sửa lại thành:
$this->Form->...
mới thực thi được.
Cám ơn bạn vì bài viết rất bổ ích, mình mới học CakePHP nên mong bạn sẽ có nhiều bài hơn.
Cảm ơn bạn. Thực ra trên máy mình sử dụng $form vẫn chạy. Mình sẽ test lại!
Trả lờiXóaCác bài admin viết có hệ thống nên dễ hiểu quá, hi vọng sẽ có nhiều bài viết hay như thế này
Trả lờiXóaError: Call to a member function create() on a non-object
Trả lờiXóaFile: C:\xampp\htdocs\cache\app\View\tasks\add.ctp
Ai biết lỗi gì đây sửa giúp em ạ