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([ 
  53                         #'data_class' => null, 
  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()); 
  71                 //With bundle named entity 
  73                         ($pos = strpos($this->class, ':')) !== false && 
  74                         !empty($entity = substr($this->class, $pos + 
1)) 
  76                         //Set class from namespace and entity name 
  77                         $this->class = str_replace('Form\\Extension\\Type', 'Entity\\' ,__NAMESPACE__
).$entity; 
  80                 //Set this as model transformer 
  81                 //XXX: clone the model transformer to allow multiple hiddenentitytype field with different class 
  82                 $builder->addModelTransformer(clone $this); 
  86          * Transform data to string 
  88          * @param mixed $data The data object 
  89          * @return string The object id 
  91         public function transform($data): string { 
  92                 //Modified from comments to use instanceof so that base classes or interfaces can be specified 
  93                 if ($data === null || !$data instanceof $this->class) { 
  97                 $res = $data->getId(); 
 103          * Reverse transformation from string to data object 
 105          * @param string $data The object id 
 106          * @return mixed The data object 
 108         public function reverseTransform($data) { 
 115                         $rep = $this->dm
->getRepository($this->class); 
 116                         $res = $rep->findOneById($data); 
 117                 } catch (\Exception 
$e) { 
 118                         throw new TransformationFailedException($e->getMessage()); 
 122                         throw new TransformationFailedException(sprintf('A %s with id %s does not exist!', $this->class, $data));