From a463786a94041a759e6420045eb031183a5f6afc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Gertz?= Date: Mon, 28 Dec 2020 08:27:55 +0100 Subject: [PATCH] Add HidenEntity field type --- Form/Extension/Type/HiddenEntityType.php | 113 +++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Form/Extension/Type/HiddenEntityType.php diff --git a/Form/Extension/Type/HiddenEntityType.php b/Form/Extension/Type/HiddenEntityType.php new file mode 100644 index 0000000..3e85cc6 --- /dev/null +++ b/Form/Extension/Type/HiddenEntityType.php @@ -0,0 +1,113 @@ +dm = $doctrine; + } + + /** + * Configure options + * + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) { + //Call parent + parent::configureOptions($resolver); + + // Derive "data_class" option from passed "data" object + $class = function (Options $options) { + return isset($options['data']) && \is_object($options['data']) ? \get_class($options['data']) : null; + }; + + $resolver->setDefaults([ + 'class' => $class + ]); + } + + + /** + * Build form + * + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options): void { + #$this->entityClass = sprintf('App\Entity\%s', ucfirst($builder->getName())); + #var_dump($builder->getName()); + #$this->entityClass = sprintf('App\Entity\%s', ucfirst($builder->getName())); + //$this->dataClass[$builder->getName()] = $options['data_class']; + + //Set class from options['class'] + $this->class = $options['class']; + + //Check class + if (empty($this->class)) { + //Set class from namespace and field name + $this->class = str_replace('Form\\Extension\\Type', 'Entity\\' ,__NAMESPACE__).ucfirst($builder->getName()); + } + + //Set this as model transformer + //XXX: clone the model transformer to allow multiple hiddenentitytype field with different class + $builder->addModelTransformer(clone $this); + } + + public function transform($data): string { + // Modified from comments to use instanceof so that base classes or interfaces can be specified + if ($data === null || !$data instanceof $this->class) { + return ''; + } + + $res = $data->getId(); + + return $res; + } + + public function reverseTransform($data) { + if (!$data) { + return null; + } + + $res = null; + try { + $rep = $this->dm->getRepository($this->class); + $res = $rep->findOneById($data); + } catch (\Exception $e) { + throw new TransformationFailedException($e->getMessage()); + } + + if ($res === null) { + throw new TransformationFailedException(sprintf('A %s with id "%s" does not exist!', $this->class, $data)); + } + + return $res; + } +} -- 2.41.1