Вопрос:

Sylius: требуется адрес при регистрации

php symfony symfony-forms sylius

118 просмотра

1 ответ

174 Репутация автора

Я хочу, чтобы клиенты указали свой адрес прямо при регистрации, а не при оформлении заказа.

Я вижу, что 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 первую запись?

Автор: Holicz Источник Размещён: 04.01.2018 10:03

Ответы (1)


0 плюса

918 Репутация автора

Может быть, немного поздно, но если кто-то еще наткнется на ваш вопрос, вот как я решил это ...

Как вы сами указали, есть атрибут $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) }}
Автор: Jeroen Размещён: 08.05.2019 02:24
Вопросы из категории :
32x32