2

我需要在订购过程中实施一些额外的事情——对于每个订购的物品,crm 用户应该选择一个客户“选项”,并且应该按顺序保存该选择。因此,我创建了与客户具有多对一关系的新实体,为其实施了 CRUD,一切正常,成功创建了具有不同客户的项目数量。

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

此外,最好实现一些逻辑来验证 LineItem 中为产品选择的选项是否与客户相关,并在由于某种原因出错时抛出异常。但是我可以在哪里实现呢?

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

4

2 回答 2

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。省略示例中的最后一个参数,因为无论如何您都应该替换该值。

于 2021-02-23T12:49:44.773 回答
0

终于成功了!需要像上一个答案一样使用迁移,这里是 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-24T21:55:10.857 回答