Symfony form (P4)
Bài đăng này đã không được cập nhật trong 4 năm
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 ExtendedJobInformationlà chưa thông tin thêm cho bảngjob.
- 
Bây giờ giả sử mỗi một đối tượng JobeetJobcó ít nhất 1ExtendedJobInformation. VàExtendedJobInformationnày trườngtitle,contentkhông được để trống .
- 
Đây là cấu trúc BaseExtendedJobInformationForm

- 
2 fields title,contentmặ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 Baselà do symfony sinh ra và sẽ được tự động cập nhật lại khi thay đổischema.ymlvì vậy bạn không nên sửa những file này . Do đó ta sửaExtendedJobInformationForm

- 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óExtendedJobInformationthì 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ượngExtendedJobInformationmới và gán vào form embed
- 
Trong JobeetJobFormta thêm các hàm như sau

- 
Ở 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 . FunctionfetchOnesẽ trả về fail nếu không có record nào trong db phù hợp điều kiện.
- 
ExtendedJobInformationtôi chỉ cần user nhập vào 2 đối property làtitlevà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 JobeetJobFormvớ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 editvàupdategọi thêm functionenbedForms

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

- 
Đây là hình ảnh ta có trước khi enbedForm  
- 
Trước khi embed thì khi echo $formsẽ in ra tất cả cả fields của form mà ta đã định nghĩa trong hàmusefields
- 
Đây là kết quả sau khi embed và in ra 

- Như bạn thấy ExtendedJobInformationFormgiờ được coi như 1 fields của formJobeetJobForm.
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 savecủ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 savecủa form Ví dụ:

- 
Trên đây tôi bổ sung hàm savecủa formJobeetJobForm. ở trên tôi đã đề cập nếu bạn muốn nhúng 1 form thì dùng hàmembedForm. Ở hàmsavenày tôi muốn lấy ra form đã được embeded thì dùng hàmgetEmbeddedForm. Vì khi embedExtendedJobInformationchưa được định nghĩarelationvớijobnên tôi sẽ định nghĩa quan hệ này ở hàmdoSave.
- 
Tại sao lại là hàm doSavethì 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ủasfFormObjectđược định nghĩa như sau:

- Và hàm doSave

=> 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:

Chúc các bạn thành công !
Tài liệu tham khảo: http://symfony.com/legacy/doc/jobeet/1_2/vi_VN/03?orm=Doctrine
All rights reserved
 
  
 