From 949d6f07cd8153546dea0a59b9f6c2c4fb156bad Mon Sep 17 00:00:00 2001 From: Victor Vasiloi Date: Sun, 17 May 2020 13:19:19 +0300 Subject: [PATCH] review updates --- .../Behat/Page/Shop/Checkout/AddressPage.php | 2 +- .../Form/Type/Checkout/AddressType.php | 62 ++++++++++++------- .../Resources/config/services/checkout.xml | 2 +- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/Sylius/Behat/Page/Shop/Checkout/AddressPage.php b/src/Sylius/Behat/Page/Shop/Checkout/AddressPage.php index fcbecd8989..2278fda38a 100644 --- a/src/Sylius/Behat/Page/Shop/Checkout/AddressPage.php +++ b/src/Sylius/Behat/Page/Shop/Checkout/AddressPage.php @@ -301,7 +301,7 @@ class AddressPage extends SymfonyPage implements AddressPageInterface 'login_password' => '[data-test-password-input]', 'login_validation_error' => '[data-test-login-validation-error]', 'next_step' => '[data-test-next-step]', - 'shipping_address' => '#sylius-shipping-address', + 'shipping_address' => '[data-test-shipping-address]', 'shipping_address_book' => '[data-test-shipping-address] [data-test-address-book]', 'shipping_city' => '[data-test-shipping-city]', 'shipping_country' => '[data-test-shipping-country]', diff --git a/src/Sylius/Bundle/CoreBundle/Form/Type/Checkout/AddressType.php b/src/Sylius/Bundle/CoreBundle/Form/Type/Checkout/AddressType.php index 782cc1e3b8..44160703ec 100644 --- a/src/Sylius/Bundle/CoreBundle/Form/Type/Checkout/AddressType.php +++ b/src/Sylius/Bundle/CoreBundle/Form/Type/Checkout/AddressType.php @@ -40,7 +40,7 @@ final class AddressType extends AbstractResourceType if (null === $addressComparator) { @trigger_error( sprintf( - 'Not passing an $addressComparator to %s constructor is deprecated since Sylius 1.7 and will be removed in Sylius 2.0.', + 'Not passing an $addressComparator to "%s" constructor is deprecated since Sylius 1.8 and will be impossible in Sylius 2.0.', __CLASS__, ), \E_USER_DEPRECATED @@ -56,35 +56,26 @@ final class AddressType extends AbstractResourceType public function buildForm(FormBuilderInterface $builder, array $options): void { $builder - ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event): void { + ->add('differentBillingAddress', CheckboxType::class, [ + 'mapped' => false, + 'required' => false, + 'label' => 'sylius.form.checkout.addressing.different_billing_address', + ]) + ->add('differentShippingAddress', CheckboxType::class, [ + 'mapped' => false, + 'required' => false, + 'label' => 'sylius.form.checkout.addressing.different_shipping_address', + ]) + ->addEventListener(FormEvents::PRE_SET_DATA, static function (FormEvent $event): void { $form = $event->getForm(); - $order = $event->getData(); /** @var OrderInterface $order */ + $order = $event->getData(); + Assert::isInstanceOf($order, OrderInterface::class); $channel = $order->getChannel(); - $differentBillingOrShippingAddressChecked = null !== $this->addressComparator - && null !== $order->getBillingAddress() && null !== $order->getShippingAddress() - && !$this->addressComparator->equal($order->getBillingAddress(), $order->getShippingAddress()); - $form - ->add('differentBillingAddress', CheckboxType::class, [ - 'mapped' => false, - 'required' => false, - 'label' => 'sylius.form.checkout.addressing.different_billing_address', - 'attr' => [ - 'checked' => $differentBillingOrShippingAddressChecked, - ], - ]) - ->add('differentShippingAddress', CheckboxType::class, [ - 'mapped' => false, - 'required' => false, - 'label' => 'sylius.form.checkout.addressing.different_shipping_address', - 'attr' => [ - 'checked' => $differentBillingOrShippingAddressChecked, - ], - ]) ->add('shippingAddress', SyliusAddressType::class, [ 'shippable' => true, 'constraints' => [new Valid()], @@ -96,6 +87,18 @@ final class AddressType extends AbstractResourceType ]) ; }) + ->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event): void { + $form = $event->getForm(); + /** @var OrderInterface $order */ + $order = $event->getData(); + + Assert::isInstanceOf($order, OrderInterface::class); + + $areAddressesDifferent = $this->areAddressesDifferent($order); + + $form->get('differentBillingAddress')->setData($areAddressesDifferent); + $form->get('differentShippingAddress')->setData($areAddressesDifferent); + }) ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options): void { $form = $event->getForm(); $resource = $event->getData(); @@ -147,4 +150,17 @@ final class AddressType extends AbstractResourceType { return 'sylius_checkout_address'; } + + private function areAddressesDifferent(OrderInterface $order): bool + { + if (null === $this->addressComparator) { + return false; + } + + if (null === $order->getBillingAddress() || null === $order->getShippingAddress()) { + return false; + } + + return !$this->addressComparator->equal($order->getBillingAddress(), $order->getShippingAddress()); + } } diff --git a/src/Sylius/Bundle/CoreBundle/Resources/config/services/checkout.xml b/src/Sylius/Bundle/CoreBundle/Resources/config/services/checkout.xml index ba8066e8a0..650eb100d6 100644 --- a/src/Sylius/Bundle/CoreBundle/Resources/config/services/checkout.xml +++ b/src/Sylius/Bundle/CoreBundle/Resources/config/services/checkout.xml @@ -39,7 +39,7 @@ %sylius.model.order.class% %sylius.form.type.checkout_address.validation_groups% - +