西莉乌斯:要求注册地址

时间:2018-01-04 10:03:04

标签: php symfony symfony-forms sylius

我希望客户在注册时填写他们的地址,而不是在第一笔订单结账时填写。

我知道,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中添加第一条记录?

1 个答案:

答案 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) }}