OroCommerce:具有扩展 oro 实体的表单
Posted
技术标签:
【中文标题】OroCommerce:具有扩展 oro 实体的表单【英文标题】:OroCommerce: Forms with extended oro entities 【发布时间】:2021-05-25 03:53:18 【问题描述】:我需要在订购过程中实施一些额外的事情 - 对于每个订购的商品,crm 用户应该选择一个客户“选项”,并且应该按顺序保存该选择。 因此,我创建了与客户具有多对一关系的新实体,为其实施了 CRUD,一切正常,成功创建了具有不同客户的项目数量。
比我扩展 Oro ShoppingList LineItem - 使用 addManyToOneRelation
创建迁移到我的实体,新的下拉菜单神奇地出现,允许使用自动完成框选择实体。一切正常,除了我只需要查看与客户相关的项目而不是所有创建的实体。它很容易获得客户(LineItem->customerUser->customer)但是如何为用于下拉的查询指定它?目前一切都是由oro创建的(这真的很酷),我只是做了一个迁移添加关系,我没有写任何可以指定客户参数的代码。
此外,最好实现一些逻辑来验证 LineItem 中为产品选择的选项是否与客户相关,并在由于某种原因出错时抛出异常。但是我可以在哪里实现呢?
Here is pic with form。还想知道为什么新字段未对齐?
【问题讨论】:
【参考方案1】:终于成功了!需要像上一个答案那样使用迁移,这里是 FormType 的代码
class CustomersOptionSelectType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (PreSetDataEvent $event)
$form = $event->getForm();
$lineItem = $event->getForm()->getParent()->getData();
$customer = $lineItem->getCustomerUser()->getCustomer();
$qb = $event->getForm()->getConfig()->getOption('query_builder');
$qb->setParameter('customer', $customer->getId());
);
public function configureOptions(OptionsResolver $resolver): void
$resolver->setDefaults([
'class' => Option::class,
'choice_label' => 'name',
'required' => true,
'query_builder' => function (EntityRepository $er)
return $er->createQueryBuilder('o')
->where('o.customer = :customer')
->orderBy('o.name', 'ASC')
;
,
]);
/**
* @inheritdoc
*/
public function getParent(): string
return Type\Select2EntityType::class;
【讨论】:
现在我需要将额外的数据传递给订单,有人可以建议如何做到这一点吗?【参考方案2】:要拥有自定义的实体列表,您必须覆盖用于您创建的实体字段的表单类型。 要创建自定义表单类型,请遵循 Symfony 指南:https://symfony.com/doc/4.4/form/create_custom_field_type.html#creating-form-types-based-on-symfony-built-in-types。
然后在 ['form']['form_type'] 选项中使用新的表单类型进行迁移,如下例所示:https://github.com/oroinc/platform/blob/67d71ffdb3491e767d323b3a775920db252718d2/src/Oro /Bundle/UserBundle/Migrations/Schema/v2_2/UpdateUserFormType.php#L17-L24。省略示例中的最后一个参数,因为无论如何您都应该替换该值。
【讨论】:
谢谢,这真的很有帮助!现在只需要访问当前 LineItem 就可以为正确的实体列表构建查询 如果表单已经知道LineItem,看看这篇文章symfony.com/doc/current/form/…以上是关于OroCommerce:具有扩展 oro 实体的表单的主要内容,如果未能解决你的问题,请参考以下文章
自定义捆绑迁移在首次安装时失败,因为它们在 OroCommerce 的安装程序之前运行