11/08/2018, 22:28

Tìm hiểu chung về symfony (tiếp)

I. Tìm hiểu chung . II. Một Số thành phần , cấu trúc cần biết khi làm việc với symfony. 1. Schema 2. ORM 3. Routing 4. Form Form Framework: Bất kì website nào cũng có các form; từ form contact đơn giản đến các form phức tạp với rất nhiều trường. Viết code cho các ...

symfony_black_01

I. Tìm hiểu chung .

II. Một Số thành phần , cấu trúc cần biết khi làm việc với symfony.

1. Schema

2. ORM

3. Routing

4. Form

  • Form Framework:

Bất kì website nào cũng có các form; từ form contact đơn giản đến các form phức tạp với rất nhiều trường. Viết code cho các form là một trong những việc rắc rối và kinh khủng đối với lập trình viên: bạn cần phải viết HTML form, thực hiện việc validation cho mỗi trường, lưu các giá trị vào trong database, hiển thị thông báo lỗi, hiển thị giá trị nhập lỗi, và còn rất nhiều việc nữa...

Tất nhiên, thay vì việc lặp lại tất cả những công việc trên, symfony cung cấp một framework để dễ dàng quản lý form. Form framework gồm 3 thành phần:

  • validation: validation sub-framework cung cấp các lớp để kiểm tra dữ liệu nhập vào (integer, string, email address, ...)
  • widgets: widget sub-framework cung cấp các lớp để trả về mã HTML (input, textarea, select, ...)
  • forms: các lớp form mô tả về các form được tạo từ widget và validator, và nó cũng cung cấp các phương thức để quản lý form. Mỗi form field đã bao gồm validator và widget.
  • Form: Một symfony form là một lớp được tạo bởi các field. Mỗi field có tên, validator, và một widget.

Screenshot from 2014-11-25 08:54:50 Các form field được cấu hình trong phương thức setup(), bằng các phương thức setValidators() và setWidgets()

- Mặc định tất cả các field đều là bắt buộc, tương đương với giá trị của option required là true. Vì thế, validation cho field của các trường tương đương với cách viết new sfValidator(array('required' => true)).

Bạn có thể nhúng một form vào một form khác bằng phương thức mergeForm(), hoặc embedForm():

Screenshot from 2014-11-25 08:59:13

  • Doctrine Forms: Trong đa số các trường hợp, một form thường gồm các trường trong database. Symfony đã biết mọi thứ về database model, do đó nó có thể tự động tạo ra các form dựa trên những thông tin này. Khi bạn thực thi lệnh doctrine:build-all , symfony đã tự động gọi lệnh doctrine:build-forms:

Screenshot from 2014-11-25 09:03:01

Lệnh doctrine:build-forms tạo ra các form classe trong thư mục lib/form/. Tổ chức các file này tương tự như trong thư mục lib/model. Mỗi model class tương ứng với một form class , các lớp này chưa có gì và thừa kế từ base class:

Screenshot from 2014-11-25 09:04:50

Mặc định, một Doctrine form hiển thị tất cả các trường trong bảng. Nhưng với một vài  form, một vài trường không được chỉnh sửa bởi người dùng. Bỏ những trường này ra khỏi form bằng cách unset chúng (như hình trên).

Unset một field có nghĩa là cả field widget và validator cũng được bỏ.

Form configuration: Ví dụ cột status trong bảng BetyoloBet có kiểu giá trị là integer nhưng ở đây chúng ta muốn giá trị của nó chỉ là 1 hoặc 2. Để làm việc này , đầu tiên hãy định nghĩa trong class BetyoloBet

Screenshot from 2014-11-25 09:11:39

Sau đó, dùng sfWidgetFormChoice cho widget status:

Screenshot from 2014-11-25 09:13:13

sfWidgetFormChoice mô tả một choice widget có thể được render thành các widget khác nhau tùy thuộc vào một vài configuration options (expanded và multiple):

  • Dropdown list (<select>): array('multiple' => false, 'expanded' => false)
  • Dropdown box (<select multiple="multiple">): array('multiple' => true, 'expanded' => false)
  • List of radio buttons: array('multiple' => false, 'expanded' => true)
  • List of checkboxes: array('multiple' => true, 'expanded' => true) Mặc dù bạn nghĩ rằng không thể submit một giá trị khác, nhưng một hacker có thể bypass dễ dàng một widget choices bằng cách sử dụng các công cụ như curl hoặc Firefox Web Developer Toolbar. Hãy sửa lại validator để bắt buộc giá trị phải trong các lựa chọn đưa ra:

Screenshot from 2014-11-25 09:18:24

Với mỗi field, symfony tự động tạo ra một label (được dùng khi render <label> tag). Ta có thể thay đổi nó với label option.

Bạn cũng có thể thay đổi nhiều label một lúc bằng cách cung cấp một mảng cho phương thức setLabels():

Screenshot from 2014-11-25 09:19:37

Ngoài ra vs 1 số trường hợp . validate của form có liên quan đến giá trị nhập vào của một số trường có phù hợp hay không . Như trường start_dt không được lớn hơn trường end_dt . Ta có thể làm như sau :

Screenshot from 2014-11-25 09:25:36

Screenshot from 2014-11-25 09:29:39

Trên đây là một số chú ý của tôi khi làm việc với form . Chúc bạn thành công !

0