![](/img/trans.png)
[英]How do I specify the EntityManager used by Symfony2 Form->handleRequest?
[英]Symfony2 - How to stop Form->handleRequest from nulling fields that don't exist in post data
我有一個在Symfony中構建的表單,當在視圖中呈現時,html表單可能包含也可能不包含表單對象中的所有字段(實體類型有幾個不同的狀態,並且並非所有字段都在風景)。
問題是,當表單在提交處理程序中處理時,通過表單對象的handleRequest()方法,它將實體中不存在於post數據中的任何屬性重置為null,從而吹掉任何現有值。
有沒有辦法告訴Symfony不要這么愚蠢,只處理POST數據中的字段?
或者我必須在handleRequest調用之前克隆實體,然后循環POST值並將post-handleRequest實體中的相關值復制到實體的pre-handleRequest克隆,因此我保留不在的字段POST數據。
唷! 正如你所看到的,它有點愚蠢的解決方案,有點愚蠢的問題,tbh。
我可以理解symfony這樣做,如果實體實際上是一個新創建的對象,但它已從DB加載然后調用handleRequest - 它應該是明智的,知道對象已經初始化並且只設置傳入的字段發布數據。
謝謝你的幫助。
問候
史蒂夫。
簡而言之,不要使用handleRequest
。
您應該直接使用submit
,並將clearMissing
參數設置為false。
的Symfony /組件/表格/ FormInterface
/**
* Submits data to the form, transforms and validates it.
*
* @param null|string|array $submittedData The submitted data.
* @param bool $clearMissing Whether to set fields to NULL
* when they are missing in the
* submitted data.
*
* @return FormInterface The form instance
*
* @throws Exception\AlreadySubmittedException If the form has already been submitted.
*/
public function submit($submittedData, $clearMissing = true);
當你使用handleRequest
它handleRequest
算出你想要提交的數據,然后使用$form->submit($data, 'PATCH' !== $method);
提交它$form->submit($data, 'PATCH' !== $method);
,這意味着除非您使用PATCH
方法提交表單,否則它將清除字段。
要自己提交表格而不清除您可以使用...
$form->submit($request->get($form->getName()), false);
..從請求中獲取表單數據數組並直接提交,但明確缺少字段參數設置為false。
如果您的實體具有不同的狀態,則可以在表單類型中反映出這一點。
創建包含不同字段設置的多個表單類型(可能使用繼承),並在控制器中實例化所需的字段設置。
像這樣的東西:
class YourState1FormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('someField')
;
}
}
class YourState2FormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('someOtherField')
;
}
}
或者在控制器中創建時將參數傳遞給單個表單類型,並根據狀態調整字段設置。 如果您不添加不存在的字段,則不會對其進行處理。
像這樣的東西:
class YourFormType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
if($options['state'] == 'state1') {
$builder
->add('someField')
;
} else if($options['state'] == 'state2') {
$builder
->add('someOtherField')
;
}
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'state' => 'state1'
));
}
}
更新
您可以根據提交的數據修改表單的另一種方法是將事件偵聽器注冊到表單的PRE_SET_DATA和POST_SUBMIT事件。 這些偵聽器在表單提交過程中的不同時刻被調用,並允許您根據在表單創建時傳遞給表單類型的數據對象(PRE_SET_DATA)或用戶提交的表單數據(POST_SUBMIT)來修改表單。
您可以在文檔中找到解釋和示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.