如何解决OroCommerce:具有扩展 oro 实体的表单
我需要在订购过程中实现一些额外的东西 - 对于每个订购的项目,crm 用户应该选择一个客户“选项”,并且该选择应该按顺序保存。 因此,我创建了与 Customer 具有 ManyToOne 关系的新实体,为其实施了 CRUD 并且一切正常,成功创建了具有不同 Customer 的项目数。
比我扩展 Oro ShoppingList LineItem - 使用 addManyToOneRelation
创建迁移到我的实体和新下拉菜单神奇地出现允许使用自动完成框选择实体。一切正常,除了我只需要看到与客户相关的项目而不是所有创建的实体。它很容易获得客户(LineItem->customerUser->customer)但是如何为用于下拉列表的查询指定它?目前一切都是由oro创建的(真的很酷),我只做了一个迁移添加关系,我没有写任何可以指定客户参数的代码。
此外,最好实现一些逻辑来验证为 LineItem 中的产品选择的选项与客户相关,并在由于某种原因错误时抛出异常。但是我可以在哪里实现它?
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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。