From 0db82c9266bdad03811724263f0bc52a5da56101 Mon Sep 17 00:00:00 2001 From: Sylry Date: Thu, 1 Oct 2020 13:05:32 +0200 Subject: [PATCH] Hide hidden fields on form from constraint --- .../AddressEmbeddableTypeSubscriber.php | 54 +++++++++++++++++-- Resources/config/services.yml | 1 + 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Form/EventListener/AddressEmbeddableTypeSubscriber.php b/Form/EventListener/AddressEmbeddableTypeSubscriber.php index 90b232c..f78e63b 100644 --- a/Form/EventListener/AddressEmbeddableTypeSubscriber.php +++ b/Form/EventListener/AddressEmbeddableTypeSubscriber.php @@ -11,11 +11,16 @@ use CommerceGuys\Addressing\Country\CountryRepository; use CommerceGuys\Addressing\Country\CountryRepositoryInterface; use Daften\Bundle\AddressingBundle\Entity\AddressEmbeddable; +use Daften\Bundle\AddressingBundle\Validator\Constraints\EmbeddedAddressFormatConstraint; use Doctrine\Common\Persistence\ObjectRepository; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormFactoryInterface; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Validator\Exception\NoSuchMetadataException; +use Symfony\Component\Validator\Mapping\PropertyMetadataInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; class AddressEmbeddableTypeSubscriber implements EventSubscriberInterface { @@ -39,6 +44,11 @@ class AddressEmbeddableTypeSubscriber implements EventSubscriberInterface */ private $formFactory; + /** + * @var ?ValidatorInterface + */ + private $validator; + /** * @param CountryRepositoryInterface $countryRepository * @param FormFactoryInterface $factory @@ -47,12 +57,14 @@ public function __construct( FormFactoryInterface $factory, CountryRepositoryInterface $countryRepository, AddressFormatRepositoryInterface $addressFormatRepository, - SubdivisionRepositoryInterface $subdivisionRepository + SubdivisionRepositoryInterface $subdivisionRepository, + ValidatorInterface $validator = null ) { $this->formFactory = $factory; $this->countryRepository = $countryRepository; $this->addressFormatRepository = $addressFormatRepository; $this->subdivisionRepository = $subdivisionRepository; + $this->validator = $validator; } /** @@ -101,7 +113,7 @@ public function preSetData(FormEvent $event): void ], ]; } - foreach (AddressFormatHelper::getGroupedFields($addressFormat->getFormat()) as $line_index => $line_fields) { + foreach (AddressFormatHelper::getGroupedFields($addressFormat->getFormat(), $this->getFieldOverrides($form)) as $line_index => $line_fields) { foreach ($line_fields as $field_index => $field) { $form->add( $field, @@ -142,7 +154,7 @@ public function preSubmit(FormEvent $event): void $form->remove($field); } - foreach (AddressFormatHelper::getGroupedFields($addressFormat->getFormat()) as $line_index => $line_fields) { + foreach (AddressFormatHelper::getGroupedFields($addressFormat->getFormat(), $this->getFieldOverrides($form)) as $line_index => $line_fields) { foreach ($line_fields as $field_index => $field) { $form->add($field); } @@ -153,4 +165,40 @@ public function preSubmit(FormEvent $event): void $form->remove($field); } } + + private function getFieldOverrides(FormInterface $form) + { + if (!$this->validator) { + return null; + } + + $formParent = $form->getParent(); + if (!$formParent) { + return null; + } + + $parentEntity = $formParent->getData(); + if (!is_object($parentEntity)) { + return null; + } + + try { + $metadata = $this->validator->getMetadataFor(get_class($parentEntity)); + } catch (NoSuchMetadataException $e) { + return null; + } + + $propertyMetadatas = $metadata->getPropertyMetadata($form->getName()); + /** @var PropertyMetadataInterface $propertyMetadata */ + foreach ($propertyMetadatas as $propertyMetadata) { + $constraints = $propertyMetadata->getConstraints(); + foreach ($constraints as $constraint) { + if ($constraint instanceof EmbeddedAddressFormatConstraint) { + return $constraint->fieldOverrides; + } + } + } + + return null; + } } diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 4a1be51..c55a59e 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -11,6 +11,7 @@ services: - '@commerceguys.addressing.country.country_repository' - '@commerceguys.addressing.address_format.address_format_repository' - '@commerceguys.addressing.subdivision.subdivision_repository' + - '@?validator' daften.form.type.address: class: Daften\Bundle\AddressingBundle\Form\Type\AddressEmbeddableType