Skip to content

Instantly share code, notes, and snippets.

@adamsafr
Created September 7, 2017 08:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adamsafr/b0ed3a467b519de88262fc7119718f52 to your computer and use it in GitHub Desktop.
Save adamsafr/b0ed3a467b519de88262fc7119718f52 to your computer and use it in GitHub Desktop.
[php] Hidden field for Symfony2 entities
<?php
namespace Dpn\ToolsBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\Common\Persistence\ObjectManager;
use Dpn\ToolsBundle\Form\DataTransformer\EntityToIdTransformer;
class EntityHiddenType extends AbstractType
{
/**
* @var ObjectManager
*/
protected $objectManager;
/**
* Constructor
* @param ObjectManager $objectManager
*/
public function __construct(ObjectManager $objectManager)
{
$this->objectManager = $objectManager;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new EntityToIdTransformer($this->objectManager, $options['class']);
$builder->addModelTransformer($transformer);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver
->setRequired(array('class'))
->setDefaults(array(
'invalid_message' => 'The entity does not exist.',
))
;
}
/**
* {@inheritdoc}
*/
public function getParent()
{
return 'Symfony\Component\Form\Extension\Core\Type\HiddenType';
}
}
<?php
namespace Dpn\ToolsBundle\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Doctrine\Common\Persistence\ObjectManager;
class EntityToIdTransformer implements DataTransformerInterface
{
/**
* @var ObjectManager
*/
protected $objectManager;
/**
* @var string
*/
protected $class;
/**
* Constructor
* @param ObjectManager $objectManager
* @param string $class
*/
public function __construct(ObjectManager $objectManager, $class)
{
$this->objectManager = $objectManager;
$this->class = $class;
}
/**
* {@inheritdoc}
*/
public function transform($entity)
{
if (null === $entity) {
return;
}
return $entity->getId();
}
/**
* {@inheritdoc}
*/
public function reverseTransform($id)
{
if (!$id) {
return null;
}
$entity = $this->objectManager
->getRepository($this->class)
->find($id);
if (null === $entity) {
throw new TransformationFailedException();
}
return $entity;
}
}
<?php
namespace Dpn\ToolsBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Dpn\ToolsBundle\Form\Type\EntityHiddenType;
class ExampleType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('category', EntityHiddenType::class, array(
'label' => false,
'class' => 'Dpn\ToolsBundle\Entity\Category'
))
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Tma\MainBundle\Entity\Example',
));
}
}
services:
dpn.type.entity_hidden:
class: Dpn\ToolsBundle\Form\Type\EntityHiddenType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment