12/08/2018, 13:18

Symfony form (P4)

Symfony Form (P4) Phần 3 bạn có thể đọc tại đây https://viblo.asia/posts/aKYMNBbEM83E Embed 1 form vào 1 form khác Trong phần trước bảng ExtendedJobInformation đã được thêm vào database. Và database đã được quản lý bằng migration. Mục tiêu của bảng ExtendedJobInformation là ...

Symfony Form (P4)

Phần 3 bạn có thể đọc tại đây

https://viblo.asia/posts/aKYMNBbEM83E

Embed 1 form vào 1 form khác

  • Trong phần trước bảng ExtendedJobInformation đã được thêm vào database. Và database đã được quản lý bằng migration.

Screenshot from 2016-03-23 17:41:50.png

  • Mục tiêu của bảng ExtendedJobInformation là chưa thông tin thêm cho bảng job.

  • Bây giờ giả sử mỗi một đối tượng JobeetJob có ít nhất 1 ExtendedJobInformation. Và ExtendedJobInformation này trường title, content không được để trống .

  • Đây là cấu trúc BaseExtendedJobInformationForm

Screenshot from 2016-03-23 17:45:56.png

  • 2 fields title, content mặc định là có thể trống . Giờ ta sẽ config lại để 2 trường này là mặc định.

  • như tôi đã đề cập những file Base là do symfony sinh ra và sẽ được tự động cập nhật lại khi thay đổi schema.yml vì vậy bạn không nên sửa những file này . Do đó ta sửa ExtendedJobInformationForm

Screenshot from 2016-03-23 17:47:48.png

  • Symfony form cung cấp 1 hàm để embed các form khác vào form hiện tại đó là hàm embedForm. Bạn có thể đọc ở đây để tham khảo thêm 1 số tính năng của hàm nay

http://symfony.com/legacy/doc/more-with-symfony/1_4/en/06-Advanced-Forms

  • Khi embed form sẽ có 2 trường hợp là nếu JobeetJob đã có ExtendedJobInformation thì lấy object này trong db và khở tạo làm giá trị mặc định cho form embed. Nếu không thì ta tạo 1 đối tượng ExtendedJobInformation mới và gán vào form embed

  • Trong JobeetJobForm ta thêm các hàm như sau

Screenshot from 2016-03-23 18:00:32.png

  • Ở trên tôi tạo một Doctrine_Query để tim ra một phần tử thỏa mãn điều kiện . Function fetchOne sẽ trả về fail nếu không có record nào trong db phù hợp điều kiện.

  • ExtendedJobInformation tôi chỉ cần user nhập vào 2 đối property là title và content. Nên function useFields chỉ định danh 2 property này .

  • Sau đó ta set label cho các fields tương ứng và cuối cùng là embed nó vào JobeetJobForm với tên được chỉ định là extended_job_infomation

Lúc này đã khai báo xong function enbed form ExtendedJobInformationForm cho JobeetJobForm. Chúng ta sẽ sử dụng nó trong action edit chẳng hạng.

  • Sửa action edit và update gọi thêm function enbedForms

Screenshot from 2016-03-24 08:14:01.png

  • Template của action showSucess vẫn như cũ:

Screenshot from 2016-03-24 08:11:01.png

  • Đây là hình ảnh ta có trước khi enbedForm ca7cae7d5bfd20c75150033bb3a27eaac04d6e3d.png

  • Trước khi embed thì khi echo $form sẽ in ra tất cả cả fields của form mà ta đã định nghĩa trong hàm usefields

  • Đây là kết quả sau khi embed và in ra

Screenshot from 2016-03-24 08:15:21.png

  • Như bạn thấy ExtendedJobInformationForm giờ được coi như 1 fields của form JobeetJobForm.

Như vậy chúng ta đã embed thành công form ExtendedJobInformationForm

Lưu dữ liệu với form embed

  • Có lẽ bạn sẽ thắc mắc là sau khi embed thì ta có cần viết code sử lý để lưu lại các đối tượng ứng với form được embed không . Thì câu là trả lời là không . Hàm save của form trong symfony sẽ tự động làm các việc này .
  • Bạn cũng có thể customize lại hàm save của form Ví dụ:

Screenshot from 2016-03-24 08:18:29.png

  • Trên đây tôi bổ sung hàm save của form JobeetJobForm. ở trên tôi đã đề cập nếu bạn muốn nhúng 1 form thì dùng hàm embedForm. Ở hàm save này tôi muốn lấy ra form đã được embeded thì dùng hàm getEmbeddedForm. Vì khi embed ExtendedJobInformation chưa được định nghĩa relation với job nên tôi sẽ định nghĩa quan hệ này ở hàm doSave.

  • Tại sao lại là hàm doSave thì tôi sẽ giải thích như sau: Các form của symfony đều được thừa kế từ sfFormObject. và hàm save của sfFormObject được định nghĩa như sau:

Screenshot from 2016-03-24 08:21:52.png

  • Và hàm doSave

Screenshot from 2016-03-24 08:22:19.png

=> Vậy nên nếu bạn muốn sửa hàm save thì tốt nhất là định nghĩa lại hàm doSave. Hàm doSave của tôi ở đây chỉ khai báo quan hệ cho object của form extendedJobInformationForm và khai báo thêm thuộc tính created_by làm ví dụ

  • Kết quả trong db thu được:

Screenshot from 2016-03-24 08:24:24.png

Chúc các bạn thành công !

0