3 namespace Rapsys\AirBundle\Form\Extension\Type
;
5 use Doctrine\Persistence\ManagerRegistry
;
6 use Symfony\Component\Form\DataTransformerInterface
;
7 use Symfony\Component\Form\Exception\TransformationFailedException
;
8 use Symfony\Component\Form\Extension\Core\Type\HiddenType
;
9 use Symfony\Component\Form\FormBuilderInterface
;
10 use Symfony\Component\OptionsResolver\Options
;
11 use Symfony\Component\OptionsResolver\OptionsResolver
;
14 * Hidden Entity Type class definition
16 * @see https://symfony.com/doc/current/form/create_custom_field_type.html
18 class HiddenEntityType
extends HiddenType
implements DataTransformerInterface
{
20 * @var ManagerRegistry $dm
32 * @param ManagerRegistry $doctrine
34 public function __construct(ManagerRegistry
$doctrine) {
35 $this->dm
= $doctrine;
43 public function configureOptions(OptionsResolver
$resolver) {
45 parent
::configureOptions($resolver);
47 // Derive "data_class" option from passed "data" object
48 $class = function (Options
$options) {
49 return isset($options['data']) && \
is_object($options['data']) ? \
get_class($options['data']) : null;
52 $resolver->setDefaults([
63 public function buildForm(FormBuilderInterface
$builder, array $options): void {
64 //Set class from options['class']
65 $this->class = $options['class'];
68 if (empty($this->class)) {
69 //Set class from namespace and field name
70 $this->class = str_replace('Form\\Extension\\Type', 'Entity\\' ,__NAMESPACE__
).ucfirst($builder->getName());
73 //Set this as model transformer
74 //XXX: clone the model transformer to allow multiple hiddenentitytype field with different class
75 $builder->addModelTransformer(clone $this);
79 * Transform data to string
81 * @param mixed $data The data object
82 * @return string The object id
84 public function transform($data): string {
85 // Modified from comments to use instanceof so that base classes or interfaces can be specified
86 if ($data === null || !$data instanceof $this->class) {
90 $res = $data->getId();
96 * Reverse transformation from string to data object
98 * @param string $data The object id
99 * @return mixed The data object
101 public function reverseTransform($data) {
108 $rep = $this->dm
->getRepository($this->class);
109 $res = $rep->findOneById($data);
110 } catch (\Exception
$e) {
111 throw new TransformationFailedException($e->getMessage());
115 throw new TransformationFailedException(sprintf('A %s with id %s does not exist!', $this->class, $data));