我从事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());
}
}
]);
观察结果:没有返回错误,但也没有数据。
带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
}
使用Symfony/PHP:
看看这个答案,希望它适用于你正在使用的版本,我相信是这样,因为它说它是在2.7版本上添加的:https://stackoverflow.com/a/35941528/17089665
使用JS:
您可以发送一个变量,即使它存储在当前会话中,但应该在controller
中执行。创建form
时,可以在渲染函数中发送变量。
通常情况下,您会将要创建表单的类的对象作为参数发送。我建议您使用Entity
的setter来获取预定义值。
所以。。。一个简单的例子,如果你想显示一个下拉列表:
用于创建一盒苹果的AppleController:
$arrayOfTypes = however_you_get_your_info(); // <- With different types of apples
$newAppleBox = new AppleBox();
$newAppleBox->setWhateverVariableWithPredefinedValue() // Here, for example, if you were to create a modifyUserInfo template or something like this, you could prepopulate this with the current info so they don't need to write everything again.
$form = $this->createForm(AppleRegistrationType::class, $newAppleBox);
if ($form->isSubmitted() && $form->isValid()) {
// blablabla
}
return $this->render('registrations/appleBox.html.twig', [
'appleBoxRegistrationForm' => $form->createView(),
'typesArray' => $arrayOfTypes
]);
然后,在您的表单中,您可以正常创建EntityType
:
use AppEntityUser;
use SymfonyBridgeDoctrineFormTypeEntityType;
// ...
$builder->add('users', EntityType::class, [
'class' => User::class,
blablabla
]);
最后,在您的模板中,您可以使用twig
和js
来日常检索该列表,并将其放在新的<select>
中(我相信这就是EntityType
在HTML中的含义(。
此外,请查看官方文档:
https://symfony.com/doc/current/reference/forms/types/entity.html#using-选择