OroCommerce:带有扩展oro实体的表单



我需要在订购过程中实现一些额外的东西-对于每个订购的项目crm用户应该选择客户选项之一;这个选择应该按顺序保存。因此,我创建了与客户有ManyToOne关系的新实体,为其实现了CRUD,并且所有工作正常,成功地创建了具有不同客户的项目数量。

然后我扩展了Oro ShoppingList LineItem -用addManyToOneRelation创建的迁移到我的实体,新的下拉菜单神奇地出现了,允许使用自动完成框选择实体。所有工作都很好,除了我需要看到只有与客户相关的项目,而不是所有创建的实体。它很容易得到客户(LineItem->customerUser->customer),但如何指定它用于下拉查询?目前一切都是由oro创建的(这真的很酷),我只做了一个迁移添加关系,我没有写任何可以指定客户参数的代码。

还可以实现一些逻辑验证,以确定LineItem中为product选择的选项是否与客户相关,并在由于某种原因出错时抛出异常。但我能在哪里实现呢?

这是一张带有表格的图片。还想知道为什么新字段不对齐?

要有一个自定义的实体列表,您必须覆盖用于您创建的实体字段的表单类型。要创建自定义表单类型,请遵循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。省略示例中的最后一个参数,因为在任何情况下都应该替换该值。

终于成功了!需要像前面的答案一样使用迁移,这里是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 TypeSelect2EntityType::class;
}
}

最新更新