我需要在订购过程中实现一些额外的东西--对于每个订购的项目,crm用户应该选择一个客户“选项”,并且选择应该按顺序保存。所以我创建了一个新的实体,它与客户有ManyToOne关系,为它实现了CRUD,所有的工作都正常,成功地与不同的客户创建了多个项目。
我扩展了Oro ShoppingList LineItem -用addManyToOneRelation创建的迁移到我的enitity和新的下拉列表中,允许使用自动完成框来选择实体。所有工作正常,除了我需要看到只有与客户相关的项目,而不是所有创建的实体。很容易获得客户(LineItem->customerUser-> customer ->customer->customerUser->customer目前,所有的东西都是由oro创建的(这真的很酷),我只做了一个迁移添加关系,我没有编写任何可以指定客户参数的代码。
另外,最好实现一些逻辑验证,即在LineItem中为产品选择的选项与客户相关,如果出于某些原因,它会抛出异常。但我能在哪里实现呢?
这是有形式的图片。还想知道为什么新的字段不对齐?
发布于 2021-02-24 21:55:10
终于起作用了!需要使用像prev答案中的迁移,下面是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;
}
}发布于 2021-02-23 12:49:44
若要具有实体的自定义列表,必须重写已创建的实体字段所使用的窗体类型。要创建自定义表单类型,请遵循Symfony指南:type.html#creating-form-types-based-on-symfony-built-in-types。
然后在“form”选项下使用新的表单类型进行迁移,如本例所示:2/UpdateUserFormType.php#L17-L24。省略示例中的最后一个参数,因为在任何情况下都应该替换该值。
https://stackoverflow.com/questions/66323606
复制相似问题