Skip to content

Commit

Permalink
Extract admin-only AddressType
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMilek committed May 22, 2024
1 parent 592f1ea commit 8ef9c28
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 113 deletions.

This file was deleted.

66 changes: 64 additions & 2 deletions src/Sylius/Bundle/AdminBundle/Form/Type/AddressType.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,75 @@
namespace Sylius\Bundle\AdminBundle\Form\Type;

use Sylius\Bundle\AddressingBundle\Form\Type\AddressType as BaseAddressType;
use Sylius\Bundle\AddressingBundle\Form\Type\ProvinceCodeChoiceType;
use Sylius\Component\Addressing\Model\CountryInterface;
use Sylius\Component\Addressing\Repository\CountryRepositoryInterface;
use Sylius\Component\Core\Model\AddressInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfonycasts\DynamicForms\DependentField;
use Symfonycasts\DynamicForms\DynamicFormBuilder;

final class AddressType extends AbstractType
{
public function getBlockPrefix(): string
/**
* @param CountryRepositoryInterface<CountryInterface> $countryRepository
*/
public function __construct(private readonly CountryRepositoryInterface $countryRepository)
{
return 'sylius_admin_address';
}

public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder = new DynamicFormBuilder($builder);

$builder
->addDependent('provinceCode', 'countryCode', function (DependentField $field, ?string $countryCode = null) {
if (null === $countryCode) {
return;
}

$country = $this->countryRepository->findOneBy(['code' => $countryCode]);

if ($country->hasProvinces()) {
$field->add(ProvinceCodeChoiceType::class, [
'country' => $country,
'placeholder' => 'sylius.form.province.select',
'label' => 'sylius.form.address.province',
'auto_initialize' => false,
]);
}
})
->addDependent('provinceName', 'countryCode', function (DependentField $field, ?string $countryCode = null) {
if (null === $countryCode) {
return;
}

$country = $this->countryRepository->findOneBy(['code' => $countryCode]);

if (!$country->hasProvinces()) {
$field->add(TextType::class, [
'label' => 'sylius.form.address.province',
'required' => false,
'auto_initialize' => false,
]);
}
});

$builder->addEventListener(
FormEvents::SUBMIT,
function (FormEvent $formEvent) {
/** @var AddressInterface $data */
$data = $formEvent->getData();
$form = $formEvent->getForm();

$form->has('provinceCode') ?: $data->setProvinceCode(null);
$form->has('provinceName') ?: $data->setProvinceName(null);
},
);
}

public function getParent(): string
Expand Down
20 changes: 18 additions & 2 deletions src/Sylius/Bundle/AdminBundle/Form/Type/OrderType.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,28 @@

use Sylius\Bundle\OrderBundle\Form\Type\OrderType as BaseOrderType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

final class OrderType extends AbstractType
{
public function getBlockPrefix(): string
public function buildForm(FormBuilderInterface $builder, array $options): void
{
return 'sylius_admin_order';
$builder
->add('shippingAddress', AddressType::class, [
'add_build_address_form_subscriber' => $options['add_build_address_form_subscriber'],
])
->add('billingAddress', AddressType::class, [
'add_build_address_form_subscriber' => $options['add_build_address_form_subscriber'],
])
;
}

public function configureOptions(OptionsResolver $resolver): void
{
parent::configureOptions($resolver);

$resolver->setDefaults(['add_build_address_form_subscriber' => true]);
}

public function getParent(): string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ sylius_admin_order_update:
permission: true
template: "@SyliusAdmin/shared/crud/update.html.twig"
form:
type: Sylius\Bundle\AdminBundle\Form\Type\OrderType
options:
validation_groups:
- sylius_shipping_address_update
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,13 @@
<tag name="form.type" />
</service>

<service id="Sylius\Bundle\AdminBundle\Form\Extension\AddressTypeExtension">
<service id="sylius_admin.form.type.address" class="Sylius\Bundle\AdminBundle\Form\Type\AddressType">
<argument type="service" id="sylius.repository.country" />
<tag name="form.type_extension" extended-type="Sylius\Bundle\AddressingBundle\Form\Type\AddressType" priority="100" />
<tag name="form.type" />
</service>

<service id="sylius_admin.form.type.order" class="Sylius\Bundle\AdminBundle\Form\Type\OrderType">
<tag name="form.type" />
</service>

<service id="sylius_admin.form.type.zone" class="Sylius\Bundle\AdminBundle\Form\Type\ZoneType">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class FormComponent
use DefaultActionTrait;
use HookableLiveComponentTrait;

#[LiveProp]
#[LiveProp(fieldName: 'resource')]
public ?Order $order = null;

/** @param class-string $formClass */
Expand Down
16 changes: 2 additions & 14 deletions src/Sylius/Bundle/CoreBundle/Form/Extension/OrderTypeExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,17 @@
use Sylius\Bundle\OrderBundle\Form\Type\OrderType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

final class OrderTypeExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('shippingAddress', AddressType::class, [
'add_build_address_form_subscriber' => $options['add_build_address_form_subscriber'],
])
->add('billingAddress', AddressType::class, [
'add_build_address_form_subscriber' => $options['add_build_address_form_subscriber'],
])
->add('shippingAddress', AddressType::class)
->add('billingAddress', AddressType::class)
;
}

public function configureOptions(OptionsResolver $resolver): void
{
parent::configureOptions($resolver);

$resolver->setDefaults(['add_build_address_form_subscriber' => true]);
}

public static function getExtendedTypes(): iterable
{
return [OrderType::class];
Expand Down

0 comments on commit 8ef9c28

Please sign in to comment.