[ZF2] Sử dụng Forms cơ bản – Phần 5

Form – hay còn gọi là khung nhập dữ liệu giúp người dùng gửi nhóm dữ liệu thông tin lên các webserver xử lý và lưu trữ chúng trong các hệ quản trị cơ sử dữ liệu. Các người lập trình viên thuần túy PHP sẽ sử dụng HTML để tạo ra các trường nhập dữ liệu hiển thị cho người dùng có thể tương tác dễ dàng. Nhưng việc tạo lập form sẽ không dừng lại ở chỗ chỉ cần hiển thị được form ra màn hình người dùng là hoàn tất, mà chúng ta cần phải lọc hay so khớp các dữ liệu người dùng gửi lên có hợp lệ hay không, khi đó chúng ta phải cần một xử lý logic để đảm nhiệm công việc này. Nhiều lập trình viên sử dụng mã Javascript để xác thực phía client trước khi gửi dữ liệu lên webserver, cách này khá đơn giản và hiệu quả giúp tránh phát sinh lỗi, giảm tải và loại bỏ các yêu cầu không hợp lệ. Tiếp theo, họ sẽ vẫn phải xử lý một bước tương tự như vậy ở phía webserver bằng các ngôn ngữ như PHP, ASP, JSP…, tức là họ phải lọc và so khớp lại các giá trị gửi lên từ client, có vẻ hơi thừa và phức tạp nhưng đây là cách để các bạn chống lại các hacker và bảo vệ website.

Zend Framework 2 là bộ mã nguồn được xây dựng OOP hoàn toàn 100%, nó cũng cung cấp một namespace Zend\Form để hỗ trợ các lập trình viên trong việc tạo lập form một cách nhanh chóng đơn giản và hiệu quả nhất. Nó bao gồm nhiều lớp đối tượng element : Zend\Form\Element\Text, Zend\Form\Element\Date,…giúp hiển thị các khung nhập tương ứng như text, date,…. Zend\Form có thể làm việc với Zend\Filter và Zend\Validator để có thể lọc và so khớp dữ liệu người dùng tương đối dễ dàng. Trong chuỗi bài viết làm việc với một bộ sưu tập Album nhạc, chúng ta đã kết nối tới database và tạo một controller – action giúp hiển thị toàn bộ bộ sưu tập nhạc ra màn hình. Thế chúng ta muốn thêm mới và cập nhập các bộ sưu tập sẽ phải làm như thế nào? Trong bài viết này chúng ta sẽ sử dụng Zend\Form để tạo các khung nhập dữ liệu và xây dựng các lớp xử lý controller – action giúp thêm mới, xóa và cập nhật các bộ sưu tập.

Thêm mới một albums

Chúng ta sẽ xây dựng một form giúp người dùng có thể nhập các thông tin của bộ sưu tập như tiêu đề, tác giả,… Ở đây chúng ta tạo một lớp Album\Form\AlbumForm kế thừa Zend\Form\Form để có thể sử dụng những đặc tính của Zend Framework 2 cung cấp.

Trong hàm khởi tạo của Album\Form\AlbumForm, chúng ta khai báo tên của form là album và thêm các trường dữ liệu nhập có tên như id, title, artist, submit để có các thành phần cần thiết giúp  hiển thị form nhập cho người dùng. Bước tiếp theo chúng ta cần phải xây dựng một lớp lọc và xác thực các dữ liệu mà người dùng gửi lên.

Các bạn hãy tạo tập tin Album.php trong thư mục module/Album/src/Album/Model, trong nó bạn khai báo lớp Album kế thừa từ lớp Zend\InputFilter\InputFilterAwareInterface. Lớp này sẽ giúp bạn lọc các dữ liệu các diệu liệu không hợp lệ và chỉ nhận các dữ liệu hợp lệ.

Zend\InputFilter\InputFilterAwareInterface cung cấp hai phương thức : setInputFilter() và getInputFilter(), nhưng chúng ta chỉ sử dụng phương thức getInputFilter() để tạo các bộ lọc trong này như loại bỏ khoảng trắng của chuỗi nhập, quy định chiều dài chuỗi dữ liệu, loại bỏ tag giống như strip_tag()… Ví dụ như trường nhập id,  chỉ chấp nhận các số nguyên dương nên sẽ sử dụng Zend\Filter\Int;  trường nhập title sẽ phải lọc các tag và loại bỏ khoảng trắng ở chuỗi dữ liệu gửi lên. Chúng ta cũng có thể chỉ định trường bắt buộc phải nhập bằng thuộc tính required  và qui định chiều dài của chuỗi bằng Zend\Filter\StringLength để đảm bảo không cho phép người dùng nhập quá nhiều ký tự và lưu vào database.

Để xứ lý việc thêm bộ sưu tập nhạc mới, chúng ta sẽ phải đi xây dựng phương thức addAction() của controller Album\Controller\AlbumController.

Sau khi khởi tạo một đối tượng AlbumForm, chúng ta sẽ xét giá trị cho thẻ nhập submitAdd dùng để xác định đây là form dùng cho công việc thêm một bộ sưu tập mới.

Chúng ta sẽ sử dụng phương thức isPost() của đối tượng Request để xác định người dùng đang gửi dữ liệu lên bằng phương thức gì(GET, POST). Nếu là POST thì dữ liệu sẽ được đẩy vào AlbumForm và sử dụng phương thức isValid() để xác thực các giá trị đó.

 Nếu dữ liệu hợp lệ với AlbumForm thì nó sẽ được chuyển đổi và lọc các trường dữ liệu cần thiết sẽ được lưu vào database. Ví dự như các dữ liệu submit sẽ được loại bỏ trước khi gọi phương thức saveAlbum() của đối tương AlbumTable.

Sau khi dữ liệu của người dùng được lưu vào database, chúng ta sẽ điều hướng sang trang hiển thị danh sách toàn bộ sưu tập có trong cơ sở dữ liệu.

 Chúng ta sẽ truyền ra view script để hiển thị form thông qua việc trả ra mảng chứa đối tượng $form là thể hiện của lớp AlbumForm.

Chúng ta cần hiển thị form cho người dùng có thể tương tác, với action add chúng ta cần tìm tới view script tương ứng . Trong các view script của Zend Framework2 cũng được cung cấp và hỗ trợ bởi nhiều view helper như formRow(), formHidden(),… giúp hiển thị form AlbumForm của chúng ta truyển ra từ action add.

Hoặc bạn có thể thay thế bởi đoạn code ngắn gọn như sau và cũng cho kết quả tương tự:

 Nhưng vẫn phải có cặp thẻ mở và đóng form:

Và kết quả hiển thị sẽ xuất hiện như sau:

Sử dụng form trong Zend Framework 2

Sử dụng form trong Zend Framework 2

Như vậy chúng ta đã hoàn thành công việc thêm một bộ sưu tập mới vào trong cơ sở dữ liệu với một form nhập dữ liệu đơn giản giúp người dùng có thể thêm mới một cách dễ dàng các album nhạc.

Chỉnh sửa bộ sưu tập nhạc

Form cập nhật thông tin của một bộ sưu tập cũng tương tự giống form thêm mới. Trong lần này chúng ta sẽ sử dụng editAction() của AlbumController.

Trước tiên, chúng ta cần xét giá trị id mà người dùng có hợp lệ không? Giá trị này chỉ chập nhận giá trị số nguyên dương, nếu bạn truyền sai thì bạn sẽ bị điều hướng về trang thêm bộ sưu tập mới. Chúng ta sử dụng controller plugin params để có thể lấy các giá trị truyền vào từ Route, Files,GET… Các cấu hình route được đặt trong các tập tin module.config.php. Nếu id = 0 thì chúng ta sẽ điều hướng tới action thêm mới album, còn không chúng ta sẽ lấy trường giá trị của bộ sưu tập đó từ database ra. Chúng ta cần chắc chắn rằng bộ sưu tập đã tồn tại trong CSDL, nếu không tìm thấy nó sẽ trả ra một exception và điều hướng chúng ta về trang hiển thị bộ sưu tập.

Để form AlbumForm có vai trò là một form cập nhật thông tin bộ sưu tập, chúng ta cần sẽ gán giá trị Edit đến nút submit của form. Khi đó form đã có thể làm chức năng của một form cập nhật chứ không còn là một form thêm mới bộ sưu tập.

Chúng ta cần sẽ sử dụng $form->bind($album) để gán các thuộc tính đối tượng Album\Model\Album tới các trường input tương ứng của form giúp hiển thị thông tin. Đây là phương thức giúp ta trong các công việc như sau:

  • Khi hiển thị dữ liệu ra form, nó sẽ khởi tạo và gán các giá trị tương ứng các trường dữ liệu với các thẻ input tương ứng.
  • Sau khi xác thực dữ liệu thành công bằng phương thức isValid(), dữ liệu từ form sẽ được đẩy một cách dễ dàng trở lại cơ sở dữ liệu.

Và giờ chúng ta cần hiển thị form dữ liệu của bộ sưu tập của chúng ta cần cập nhật, các bạn hãy chỉnh sửa lại nội dung của tập tin module/Album/view/album/album/edit.phtml như sau:

Như vậy chúng ta đã hoàn thành xong công việc hiển thị form giúp cập nhật thông tin của một bộ sưu tập với đầy đủ các trường nhập thông tin cần thiết như tiêu đề, tác giả. Sau đây, chúng ta sẽ tìm hiểu cách xóa bỏ bộ sưu tập nhạc một cách dễ dàng.

Xóa bỏ một bộ sưu tập

Để thực hiện hành động xóa một bộ sưu tập khỏi cơ sở dữ liệu chúng ta cần sử dụng deleteAction của lớp đối tượng Album\Controller\AlbumController

Chúng ta sẽ cần lấy giá trị id của bộ sưu tập từ Route và cần xác định phương thức gửi dữ liệu lên sử dụng phương thức POST bằng cách sử dụng  isPost(). Sử dụng phương thức deleteAlbum() của lớp Album\Model\AlbumTable để thực hiện xóa một trường dữ liệu trong cơ sở dữ liệu.

Trong trường hợp này, chúng ta hiển thị một thông báo xác nhận cho người dùng với các nút bấm “Có” và “Không” để đảm bảo họ thực sự muốn xóa dòng dữ liệu đó.

Kết luận

Như vậy trong bài này chúng ta đã tìm hiểu và làm việc với form giúp tương tác với database, cùng những thao tác cơ bản nhất: thêm mới, cập nhật và loại bỏ các bộ sưu tập. Nếu các bạn làm phát sinh lỗi hoặc chưa hiểu chỗ nào thì có thể để lại các bình luận bên dưới bài viết.