Symfony form (P4)
Bài đăng này đã không được cập nhật trong 3 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
ExtendedJobInformation
là chưa thông tin thêm cho bảngjob
. -
Bây giờ giả sử mỗi một đối tượng
JobeetJob
có ít nhất 1ExtendedJobInformation
. VàExtendedJobInformation
này trườngtitle
,content
không được để trống . -
Đây là cấu trúc
BaseExtendedJobInformationForm
-
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 đổischema.yml
vì 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ó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ượngExtendedJobInformation
mới và gán vào form embed -
Trong
JobeetJobForm
ta 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 . FunctionfetchOne
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 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 $form
sẽ 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
ExtendedJobInformationForm
giờ đượ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
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ụ:
-
Trên đây tôi bổ sung hàm
save
của formJobeetJobForm
. ở trên tôi đã đề cập nếu bạn muốn nhúng 1 form thì dùng hàmembedForm
. Ở hàmsave
này tôi muốn lấy ra form đã được embeded thì dùng hàmgetEmbeddedForm
. Vì khi embedExtendedJobInformation
chưa được định nghĩarelation
vớijob
nên tôi sẽ định nghĩa quan hệ này ở hàmdoSave
. -
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ủ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