首页 > 解决方案 > Sylius:添加自定义表单类型问题

问题描述

在 Sylius 上,我想为客户添加 1 个表格,以便对于特定的客户类型(例如 VIP),必须填写额外的字段。(一对一关系)

创建的实体CustomerExtra。创建的表单类型CustomerExtraType。最初,我创建的表单类型扩展了 AbstractType。客户表单显示那些额外的字段,但不会保存记录。

然后我发现 Sylius 应该扩展 AbstractResourceType 所以我进行了更改但错误抛出:

Cannot autowire service "AppBundle\Form\Type\CustomerExtraType": argument "$dataClass" of method "Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType::__construct()" is type-hinted "string", you should configure its value explicitly.

这是代码:

服务.yml

services: app.form.type.customerextra: class: AppBundle\Form\Type\CustomerExtraType tags: - { name: form.type}

配置.yml

sylius_resource: resources: app.customerextra: driver: doctrine/orm classes: model: AppBundle\Entity\CustomerExtra form: AppBundle\Form\Type\CustomerExtraType

客户实体

namespace AppBundle\Entity;
use AppBundle\Entity\CustomerExtra as BaseCustomerExtra;
use Sylius\Component\Core\Model\Customer as BaseCustomer;

class Customer extends BaseCustomer
{
    /**
     * @var CustomerExtra|null
     */
    protected $customerextra;

    public function __construct(BaseCustomerExtra $customerextra)
    {
        $this->createdAt = new \DateTime();
        $this->customerextra = $customerextra;
    }

    /**
     * {@inheritdoc}
     */
    public function getCustomerExtra(): ?BaseCustomerExtra
    {
        return $this->customerextra;
    }

    /**
     * {@inheritdoc}
     */
    public function setCustomerExtra(BaseCustomerExtra $customerextra): void
    {
        $this->customerextra = $customerextra;
        $this->customerextra->setCustomer($this);
        $customerextra->setCustomer($this);
    }

客户额外实体

private $customer;
/**
 * {@inheritdoc}
 */
public function getCustomer(): ?Customer
{
    return $this->customer;
}

/**
 * {@inheritdoc}
 */
public function setCustomer(?Customer $customer): void
{
    $this->customer = $customer;
}

客户资料类型

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event): void {
    $customer = $event->getData();

    $event->getForm()->add('customerextra', CustomerExtraType::class, [
    ]);
});

客户额外类型

namespace AppBundle\Form\Type;
use AppBundle\Entity\CustomerExtra;
use Symfony\Component\Form\FormBuilderInterface;
use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;

class CustomerExtraType extends AbstractResourceType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('customer_extra1', TextType::class, [
                'required' => false,
                'label' => 'sylius.form.customer.customer_extra1',
            ])
            ->add('customer_extra2', NumberType::class, [
                'required' => false,
                'label' => 'sylius.form.customer.customer_extra2',
            ])
        ;
    }

    public function getBlockPrefix()
    {
        return 'app_customerextra';
    }

    public function getName()
    {
        return 'admin_customerextra';
    }

}

请帮忙。

标签: symfonysylius

解决方案


尝试更改服务定义:

services:
    app.form.type.customerextra:
        class: AppBundle\Form\Type\CustomerExtraType
        arguments:
            $dataClass: AppBundle\Entity\CustomerExtra
        tags:
            - { name: form.type}

更新:好的,试试吧:

app.form.type.customerextra:
        class: AppBundle\Form\Type\CustomerExtraType
        arguments:
            - AppBundle\Entity\CustomerExtra
            - "Default"
        tags:
            - { name: form.type}

推荐阅读