【发布时间】:2022-01-02 03:29:19
【问题描述】:
我从事 Symfony 2.8 项目。该系统适用于 TextType / DateTimeType / MoneyType 但也不适用于 EntityType 和 DateType。
我尝试从会话中的值定义我的 EntityType 的默认值,该值在我在 Controller 中创建表单时传入参数,如下所示:
$filter_form = $this->createForm(FilterActeType::class, null, [
'filters' => array_merge(
$defaultFilter,
$paginatorService->getFiltersFromSessionByContext($usr->getId(), $request->attributes->get('_route'))
)
]);
我曾尝试在 EntityType 中使用 data 和 choice_value 参数,但问题是一样的:当我重新加载页面时,数据在变量会话中时表单过滤器中不存在数据。
数据参数不带匿名函数的情况:
$builder->add('etude', EntityType::class, [
'label' => $this->translator->trans('Étude'),
'class' => Etude::class,
'required' => false,
'attr' => array('dyn-form-data' => 'cabinet,createur,destinataire'), // Champs dynamique => on renseigne le ou les enfants (le(s) champ(s) qui doit être mise à jour à la modification de celui-ci)
'data' => $this->getDataFromFilters($options, 'etude'),
]);
观察:这个案例已经返回了一个错误信息:“...传递给选择字段必须被管理。也许你忘记在实体管理器中持久化它?”。
带有匿名函数的数据参数的情况:
$builder->add('etude', EntityType::class, [
'label' => $this->translator->trans('Étude'),
'class' => Etude::class,
'required' => false,
'attr' => array('dyn-form-data' => 'cabinet,createur,destinataire'), // Champs dynamique => on renseigne le ou les enfants (le(s) champ(s) qui doit être mise à jour à la modification de celui-ci)
'data' => function (EntityRepository $er) use ($options) {
if (null != $etude = $this->getDataFromFilters($options, 'etude')) {
$er->createQueryBuilder('e')->andWhere('e.id = :id')->setParameter('id', $etude->getId());
}
}
]);
Observations:: 没有错误返回但也没有数据。
带有choice_value参数的情况:
$builder->add('etude', EntityType::class, [
'label' => $this->translator->trans('Étude'),
'class' => Etude::class,
'required' => false,
'attr' => array('dyn-form-data' => 'cabinet,createur,destinataire'), // Champs dynamique => on renseigne le ou les enfants (le(s) champ(s) qui doit être mise à jour à la modification de celui-ci)
'choice_value' => function() use ($options) {
return $this->getDataFromFilters($options, 'etude');
},
]);
观察:没有错误返回,也没有数据。
Form对象中getDataFromFilters方法的代码:
/**
* @param array $filters
* @param string $field
*
* @return \DateTime|Etude|Cabinet|string|int|float|TypeDocument|ModeDistribution|null
*/
private function getDataFromFilters(array $options, string $field)
{
return (isset($options['filters'][$field]) && (null != $value = $options['filters'][$field])) ? $value : null;
}
编辑(2021 年 11 月 24 日):添加了调试
这是存储在会话中的实体的调试:
etude: Etude {#812 ▼
+__isInitialized__: true
-id: 1
-libelle: "Toto"
-mail: "yolo.toto@toto-france.fr"
-origines: PersistentCollection {#811 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#810 ▼
-elements: []
}
#initialized: false
}
-utilisateurs: PersistentCollection {#809 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#808 ▼
-elements: []
}
#initialized: false
}
-cabinets: PersistentCollection {#807 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#806 ▼
-elements: array:1 [▼
0 => Cabinet {#805 ▼
-id: 1
-libelle: "Cabinet Toto"
-etude: Etude {#812 …2}
-infoUserByEtude: PersistentCollection {#804 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#803 ▼
-elements: []
}
#initialized: false
}
-adresse: null
-villeCP: null
}
]
}
#initialized: true
}
-actes: PersistentCollection {#802 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#801 ▼
-elements: []
}
#initialized: false
}
-typeDocuments: PersistentCollection {#800 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#799 ▼
-elements: []
}
#initialized: false
}
-modeDistributions: PersistentCollection {#798 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#797 ▼
-elements: []
}
#initialized: false
}
-themeMainColor: null
-themeAccentColor: null
-logo: null
-background: null
-sous_domaine: "yolo"
-transactions: PersistentCollection {#794 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#795 ▼
-elements: []
}
#initialized: false
}
-templates: PersistentCollection {#796 ▼
-snapshot: []
-owner: null
-association: null
-em: null
-backRefFieldName: null
-typeClass: null
-isDirty: false
#collection: ArrayCollection {#138 ▼
-elements: []
}
#initialized: false
}
-aliasMail: "contact@toto-france.fr"
-smsActif: false
-notificationSmsActif: false
-paiementActif: true
-blocNoteActif: false
-connexionDirecteActif: false
-dureeTokenConnexionDirecte: 2
-smsSenderName: null
-locale: null
-faxActif: false
-dossierDebiteurActif: true
-defaultModuleActif: true
-frequenceNotification: "day"
-objetMail: null
-lienRgpd1: null
-lienRgpd2: null
-mailEchecNotification: null
…2
}
【问题讨论】:
标签: php symfony doctrine-orm