Skip to content

Commit

Permalink
Merge pull request #13 from stefandoorn/split-callable
Browse files Browse the repository at this point in the history
Move form event listeners to separate subscribers
  • Loading branch information
stefandoorn authored Jan 13, 2019
2 parents ff60459 + 11b444e commit 99c68a7
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 66 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

declare(strict_types=1);

namespace StefanDoorn\SyliusStreetNumberPlugin\Form\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

final class AppendDataToStreetFieldEventSubscriber implements EventSubscriberInterface
{
private const FIELD_STREET = 'street';

/** @var string */
private $field;

public function __construct(string $field)
{
$this->field = $field;
}

public static function getSubscribedEvents(): array
{
return [
FormEvents::PRE_SUBMIT => 'onPreSubmit',
];
}

public function onPreSubmit(FormEvent $event): void
{
$data = $event->getData();

$data[self::FIELD_STREET] = sprintf(
'%s %s',
$data[self::FIELD_STREET],
$data[$this->field]
);

$event->setData($data);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace StefanDoorn\SyliusStreetNumberPlugin\Form\EventSubscriber;

use StefanDoorn\SyliusStreetNumberPlugin\Entity\Interfaces\AddressInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

final class SetStreetWithoutNumberAndAdditionEventSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
FormEvents::PRE_SET_DATA => 'onPreSetData',
];
}

public function onPreSetData(FormEvent $event): void
{
/** @var AddressInterface $data */
$data = $event->getData();

if (!$data instanceof AddressInterface) {
return;
}

if (null === $data->getId()) {
return; // Only adjust the data from already saved entities (we add it below only on PRE SUBMIT)
}

$data->setStreet($data->getStreetWithoutNumberAndAddition());
$event->setData($data);
}
}
43 changes: 20 additions & 23 deletions src/Form/Extension/AddressTypeStreetNumberAdditionExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,34 @@
namespace StefanDoorn\SyliusStreetNumberPlugin\Form\Extension;

use Sylius\Bundle\AddressingBundle\Form\Type\AddressType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

final class AddressTypeStreetNumberAdditionExtension extends AbstractTypeExtension
{
/** @var EventSubscriberInterface */
private $appendAdditionDataToStreetFieldEventSubscriber;

public function __construct(EventSubscriberInterface $appendAdditionDataToStreetFieldEventSubscriber)
{
$this->appendAdditionDataToStreetFieldEventSubscriber = $appendAdditionDataToStreetFieldEventSubscriber;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('addition', TextType::class, [
'required' => false,
'label' => 'sylius.form.address.street_number_addition',
'validation_groups' => ['sylius', 'sylius_shipping_address_update'],
]);

$builder->addEventListener(FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$data = $event->getData();

$street = $data['street'];
$streetNumberAddition = $data['addition'];

// Add housenumber to street field to keep things compatible with Sylius
if (false !== strrpos($street, $streetNumberAddition)) {
return;
}

$data['street'] = sprintf('%s %s', $street, $streetNumberAddition);
$event->setData($data);
});
$builder->add(
'addition',
TextType::class,
[
'required' => false,
'label' => 'sylius.form.address.street_number_addition',
'validation_groups' => ['sylius', 'sylius_shipping_address_update'],
]
);

$builder->addEventSubscriber($this->appendAdditionDataToStreetFieldEventSubscriber);
}

public function getExtendedType()
Expand Down
78 changes: 35 additions & 43 deletions src/Form/Extension/AddressTypeStreetNumberExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,59 +4,51 @@

namespace StefanDoorn\SyliusStreetNumberPlugin\Form\Extension;

use StefanDoorn\SyliusStreetNumberPlugin\Entity\Interfaces\AddressInterface;
use Sylius\Bundle\AddressingBundle\Form\Type\AddressType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Validator\Constraints\NotBlank;

final class AddressTypeStreetNumberExtension extends AbstractTypeExtension
{
/** @var EventSubscriberInterface */
private $setStreetNumberWithoutNumberAndAdditionEventSubscriber;

/** @var EventSubscriberInterface */
private $appendNumberDataToStreetFieldEventSubscriber;

public function __construct(
EventSubscriberInterface $setStreetNumberWithoutNumberAndAdditionEventSubscriber,
EventSubscriberInterface $appendNumberDataToStreetFieldEventSubscriber
) {
$this->setStreetNumberWithoutNumberAndAdditionEventSubscriber = $setStreetNumberWithoutNumberAndAdditionEventSubscriber;
$this->appendNumberDataToStreetFieldEventSubscriber = $appendNumberDataToStreetFieldEventSubscriber;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('number', TextType::class, [
'required' => true,
'label' => 'sylius.form.address.street_number',
'constraints' => [new NotBlank([
'message' => 'sylius.address.street_number.not_blank',
'groups' => ['sylius', 'sylius_shipping_address_update'],
])],
'validation_groups' => ['sylius', 'sylius_shipping_address_update'],
]);

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
/** @var AddressInterface $data */
$data = $event->getData();

if (!$data instanceof AddressInterface) {
return;
}

if (null === $data->getId()) {
return; // Only adjust the data from already saved entities (we add it below only on PRE SUBMIT)
}

$data->setStreet($data->getStreetWithoutNumberAndAddition());
$event->setData($data);
});

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();

$street = $data['street'];
$streetNumber = $data['number'];

// Add housenumber to street field to keep things compatible with Sylius
if (false !== strrpos($street, $streetNumber)) {
return;
}

$data['street'] = sprintf('%s %s', $street, $streetNumber);
$event->setData($data);
});
$builder->add(
'number',
TextType::class,
[
'required' => true,
'label' => 'sylius.form.address.street_number',
'constraints' => [
new NotBlank(
[
'message' => 'sylius.address.street_number.not_blank',
'groups' => ['sylius', 'sylius_shipping_address_update'],
]
),
],
'validation_groups' => ['sylius', 'sylius_shipping_address_update'],
]
);

$builder->addEventSubscriber($this->setStreetNumberWithoutNumberAndAdditionEventSubscriber);
$builder->addEventSubscriber($this->appendNumberDataToStreetFieldEventSubscriber);
}

public function getExtendedType()
Expand Down
9 changes: 9 additions & 0 deletions src/Resources/config/services_features/street_number.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,16 @@
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="stefandoorn.sylius_street_number_plugin.form.extension.type.address_street_number" class="StefanDoorn\SyliusStreetNumberPlugin\Form\Extension\AddressTypeStreetNumberExtension">
<argument type="service" id="stefandoorn.sylius_street_number_plugin.form.event_listener.set_street_without_number_and_addition_event_subscriber" />
<argument type="service" id="stefandoorn.sylius_street_number_plugin.form.event_listener.append_number_data_to_street_field_event_subscriber" />

<tag name="form.type_extension" extended_type="Sylius\Bundle\AddressingBundle\Form\Type\AddressType" />
</service>

<service id="stefandoorn.sylius_street_number_plugin.form.event_listener.set_street_without_number_and_addition_event_subscriber" class="StefanDoorn\SyliusStreetNumberPlugin\Form\EventSubscriber\SetStreetWithoutNumberAndAdditionEventSubscriber" />

<service id="stefandoorn.sylius_street_number_plugin.form.event_listener.append_number_data_to_street_field_event_subscriber" class="StefanDoorn\SyliusStreetNumberPlugin\Form\EventSubscriber\AppendDataToStreetFieldEventSubscriber">
<argument>number</argument>
</service>
</services>
</container>
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="stefandoorn.sylius_street_number_plugin.form.extension.type.address_street_number_addition" class="StefanDoorn\SyliusStreetNumberPlugin\Form\Extension\AddressTypeStreetNumberAdditionExtension">
<argument type="service" id="stefandoorn.sylius_street_number_plugin.form.event_listener.append_addition_data_to_street_field_event_subscriber" />

<tag name="form.type_extension" extended_type="Sylius\Bundle\AddressingBundle\Form\Type\AddressType" priority="-10" />
</service>

<service id="stefandoorn.sylius_street_number_plugin.form.event_listener.append_addition_data_to_street_field_event_subscriber" class="StefanDoorn\SyliusStreetNumberPlugin\Form\EventSubscriber\AppendDataToStreetFieldEventSubscriber">
<argument>addition</argument>
</service>
</services>
</container>

0 comments on commit 99c68a7

Please sign in to comment.