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): void {
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 mixed $value The object id
106 * @return mixed The data object
108 public function reverseTransform(mixed $value): mixed {
115 $rep = $this->dm
->getRepository($this->class);
116 $res = $rep->findOneById($value);
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, $value));