我希望客户在注册时填写他们的地址,而不是在第一笔订单结账时填写。
我知道,Sylius\Component\Core\Model\Customer
有$defaultAddress: AddressInterface
和$addresses: Collection|AddressInterface[]
属性。
这是我坚持的地方。如果我知道会有单数($address: AddressInterface
),我应该扩展表单类型并添加地址字段。
但是如何要求用户在这个集合中填写一个地址呢?
我的表单类型用于注册(父级为Sylius\Bundle\CoreBundle\Form\Type\Customer\CustomerRegistrationType
):
->add(
'addresses',
CollectionType::class,
[
'entry_type' => WholesaleCustomerAddressType::class
]
)
其中WholesaleCustomerAddressType是Sylius\Bundle\AddressingBundle\Form\Type\AddressType
的子项,并删除一些字段(姓名,电话等)
不会呈现注册页面上的地址字段(只有空div)。当我转储form.adresses
时,我发现它没有孩子。
它只渲染:
<div data-form-type="collection" id="wholesale_customer_registration_addresses" class="form-control controls collection-widget" placeholder="Addresses"><div data-form-collection="list"></div></div>
表单应该只呈现一个地址的字段。点击提交后,用户应该被注册,应该只有一个地址,此地址也应该是$defaultAddress
。
我发现问题在于,在注册时,地址集合是空的。如何在Sylius中添加第一条记录?
答案 0 :(得分:0)
可能会晚一点,但是如果其他人在您的问题上迷失了方向,这就是我的解决方法...
正如您指出的那样,您有一个属性$defaultAddress: AddressInterface
。只需将此字段添加到您的自定义表单或我的表单扩展名中,然后分配适当的类型即可。我使用了Sylius\Bundle\AddressingBundle\Form\Type\AddressType
就是这样。
我的表单扩展名:
<?php
namespace App\Form\Extension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\AbstractTypeExtension;
use Sylius\Bundle\AddressingBundle\Form\Type\AddressType;
use Sylius\Bundle\CoreBundle\Form\Type\Customer\CustomerRegistrationType;
final class CustomerRegistrationTypeExtension extends AbstractTypeExtension
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
// Adding the defaultAddress as extra fields to the form
$builder->add('defaultAddress', AddressType::class, [
'label' => 'sylius.form.customer.default_address',
]);
}
/**
* {@inheritdoc}
*/
public function getExtendedTypes(): array
{
return [CustomerRegistrationType::class];
}
}
别忘了将扩展程序添加为服务:
app.form.extension.type.customer_registration:
class: App\Form\Extension\CustomerRegistrationTypeExtension
tags:
- { name: form.type_extension, extended_type: Sylius\Bundle\CustomerBundle\Form\Type\CustomerRegistrationType }
别忘了在导览模板中呈现新字段:
{{ form_row(form.defaultAddress) }}