在symfony select表单中处理大量数据

kmbjn2e3  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(132)

我有2个实体“本地化”和“工作”在我的“工作”编辑视图我必须分配许多Localizations,但每当我加载编辑视图我的表单页面需要年龄加载,因为大量的Localizations量。我决定我应该动态加载它们,但是当我设置

  1. 'query_builder' => function (EntityRepository $er): QueryBuilder {
  2. return $er->createQueryBuilder('l')
  3. ->setMaxResults(100);
  4. },

字符串
EntityType:class在形式上为最大结果ex. 100它加载它们并快速显示编辑表单。在编辑表单中,我创建了select 2小部件,通过 AJAX 加载其余的本地化,但。当我选择一个不加载初始本地化,但通过 AJAX 加载,例如第200条记录,并试图保存形式,我得到错误说:“这个值是无效的”像EntityType:class字段Map了100个可能的答案,并验证我的第200条记录无效。
我如何正确设置它?你能推荐一些捆绑,做这个魔术开箱?我正在使用symfony 5.4,我创建的 Jmeter 板没有像EasyAdmin/Sonata这样的捆绑包-纯symfony

u5i3ibmn

u5i3ibmn1#

我想出来的没有额外的包裹。我将张贴我的解决方案的人与我的类似问题为将来参考

  1. in: src/Form/JobFormType
  2. class JobFormType extends AbstractType
  3. {
  4. public function buildForm(FormBuilderInterface $builder, array $options)
  5. {
  6. //Field with a LOT of options
  7. $localizationsFieldFunction = $this->getLocalizationsFieldFunction();
  8. $builder->add('someField', TextType:class,[..args])
  9. ->add('association', EntityType:class,[...args])
  10. ;
  11. $builder->addEventListener(FormEvents::PRE_SET_DATA, $localizationsFieldFunction)
  12. ->addEventListener(FormEvents::PRE_SUBMIT, $localizationsFieldFunction)
  13. }
  14. private function getLocalizationsFieldFunction( )
  15. {
  16. return function (FormEvent $event){
  17. $form = $event->getForm();
  18. /** @var Job $data */
  19. $data = $event->getData();
  20. $localizationIds = [];
  21. //PRE_SET_DATA form event gets me Job entity
  22. if ($data instanceof Job){
  23. $localizations = $data->getLocalization();
  24. $localizationIds = array_map(function (JobLocalization $localization){
  25. return $localization->getId();
  26. },$localizations->getValues());
  27. }
  28. // PRE_SUBMIT form event gets me an array of sent ids
  29. else if (is_array($data) && isset( $data['localization'] )){
  30. $localizationIds = $data['localization'];
  31. }
  32. $form->add('localization', EntityType::class,[
  33. 'class' => JobLocalization::class,
  34. 'label'=>'Localization',
  35. 'expanded' => false,
  36. 'multiple' => true,
  37. 'required' => false,
  38. 'attr'=>[
  39. 'class'=>'select2localizations'
  40. ],
  41. 'query_builder' => function (JobLocalizationRepository $repository) use ($localizationIds) {
  42. return $repository->createQueryBuilder('localizations')
  43. ->where('localizations.id IN (:localizationIds)')
  44. ->setParameter('localizationIds', $localizationIds);
  45. }
  46. ]);
  47. };
  48. }
  49. public function configureOptions(OptionsResolver $resolver): void
  50. {
  51. $resolver->setDefaults([
  52. 'class' => Job::class,
  53. 'data_class' => Job::class,
  54. 'validation_groups' => false,
  55. 'csrf_protection'=>true,
  56. ]);
  57. }
  58. }

字符串
上面的示例以呈现形式设置选定的本地化。

  1. In assets/app.js
  2. $('.select2localizations').select2({
  3. allowClear: false,
  4. maximumSelectionLength: 3,
  5. minimumInputLength: 3,
  6. closeOnSelect:false,
  7. placeholder: 'Start typing for localization',
  8. ajax: {
  9. url: endpoint_to_search_localization_action,
  10. dataType: 'json',
  11. delay: 250,
  12. data: function (params) {
  13. return {
  14. q: params.term,
  15. };
  16. },
  17. processResults: function (data) {
  18. return {
  19. results: data.items
  20. };
  21. }
  22. }
  23. });


这个例子允许我向我的控制器发出搜索本地化的请求。

展开查看全部

相关问题