OroCommerce:带有扩展 oro 实体的表单
OroCommerce: Forms with extended oro entities
我需要在订购过程中实施一些额外的事情 - 对于每个订购的项目,crm 用户应该 select 客户“选项”之一并且 selection 应该按顺序保存。
因此,我创建了与客户具有 ManyToOne 关系的新实体,为其实施了 CRUD,并且一切正常,成功创建了具有不同客户的项目数量。
然后我扩展了 Oro ShoppingList LineItem - 使用 addManyToOneRelation
创建了迁移到我的实体,新的下拉列表神奇地出现了,允许 select 使用自动完成框的实体。一切正常,除了我只需要看到与客户相关的项目而不是所有创建的实体。它很容易获得客户(LineItem->customerUser->customer)但是如何为用于下拉列表的查询指定它?目前一切都是由oro创建的(真的很酷),我只做了一个迁移添加关系,我没有写任何可以指定客户参数的代码。
此外,实现一些逻辑来验证 LineItem 中产品的 selected 选项是否与客户相关并且如果由于某种原因错误则抛出异常将是完美的。但是我在哪里可以实现它?
Here is pic with form。还想知道为什么新字段未对齐?
要拥有自定义的实体列表,您必须覆盖用于您创建的实体字段的表单类型。
要创建自定义表单类型,请遵循 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 Type\Select2EntityType::class;
}
}
我需要在订购过程中实施一些额外的事情 - 对于每个订购的项目,crm 用户应该 select 客户“选项”之一并且 selection 应该按顺序保存。 因此,我创建了与客户具有 ManyToOne 关系的新实体,为其实施了 CRUD,并且一切正常,成功创建了具有不同客户的项目数量。
然后我扩展了 Oro ShoppingList LineItem - 使用 addManyToOneRelation
创建了迁移到我的实体,新的下拉列表神奇地出现了,允许 select 使用自动完成框的实体。一切正常,除了我只需要看到与客户相关的项目而不是所有创建的实体。它很容易获得客户(LineItem->customerUser->customer)但是如何为用于下拉列表的查询指定它?目前一切都是由oro创建的(真的很酷),我只做了一个迁移添加关系,我没有写任何可以指定客户参数的代码。
此外,实现一些逻辑来验证 LineItem 中产品的 selected 选项是否与客户相关并且如果由于某种原因错误则抛出异常将是完美的。但是我在哪里可以实现它?
Here is pic with form。还想知道为什么新字段未对齐?
要拥有自定义的实体列表,您必须覆盖用于您创建的实体字段的表单类型。 要创建自定义表单类型,请遵循 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 Type\Select2EntityType::class;
}
}