symfony - 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';
}
}
请帮忙。
解决方案
尝试更改服务定义:
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}
推荐阅读
- python - Trying to hash a username and store it in DB using hashlib and flask
- python - Capturing SIGTERM signal Heroku
- php - How do I stop a video from playing after closing a modal
- safari - TinyMCE 5 - large images pasted via Safari do not render correctly
- jenkins-pipeline - 如何在jenkinsfile中创建循环
- jenkins - How to unset environment variable in Jenkins
- python - 需要帮助将一副牌存储在一个列表中并给它们各自的整数值吗?
- docker - 如何检查docker容器内的堆大小
- python-3.x - 在一张图中绘制两条线,每条线都有自己的 y 值
- scala - 如何在同一台机器上设置不同的 Scala 版本?