Skip to content

Instantly share code, notes, and snippets.

@zebba
Created May 23, 2015 20:38
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save zebba/e7c592b094aa14833c0d to your computer and use it in GitHub Desktop.
<?php
namespace Acme\TaskBundle\Form\Type;
use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class IssueSelectorType extends AbstractType
{
private $factory;
public function __construct(IssueToNumberTransformerFactory $factory)
{
$this->factory = $factory;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = $this->factory->create($options['om']);
$builder->addModelTransformer($transformer);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'invalid_message' => 'The selected issue does not exist',
'om' => 'default'
));
}
public function getParent()
{
return 'text';
}
public function getName()
{
return 'issue_selector';
}
}
<?php
namespace Acme\TaskBundle\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\TaskBundle\Entity\Issue;
class IssueToNumberTransformer implements DataTransformerInterface
{
/**
* @var ObjectManager
*/
private $om;
/**
* @param ObjectManager $om
*/
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
/**
* Transforms an object (issue) to a string (number).
*
* @param Issue|null $issue
* @return string
*/
public function transform($issue)
{
if (null === $issue) {
return "";
}
return $issue->getNumber();
}
/**
* Transforms a string (number) to an object (issue).
*
* @param string $number
*
* @return Issue|null
*
* @throws TransformationFailedException if object (issue) is not found.
*/
public function reverseTransform($number)
{
if (!$number) {
return null;
}
$issue = $this->om
->getRepository('AcmeTaskBundle:Issue')
->findOneBy(array('number' => $number))
;
if (null === $issue) {
throw new TransformationFailedException(sprintf(
'An issue with number "%s" does not exist!',
$number
));
}
return $issue;
}
}
<?php
namespace Acme\TaskBundle\Form\DataTransformer;
use Symfony\Bridge\Doctrine\ManagerRegistry;
class IssueToNumberTransformerFactory
{
/** @var ManagerRegistry */
private $registry;
public function __construct(ManagerRegistry $registry)
{
$this->registry = $registry;
}
public function create($om)
{
return new IssueToNumberTransformer($this->registry->getManager($om));
}
}
<?php
namespace Acme\TaskBundle\Form;
use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformerFactory;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class TaskType extends AbstractType
{
/** @var IssueToNumberTransformerFactory */
private $factory;
public function __construct(IssueToNumberTransformerFactory $factory)
{
$this->factory = $factory;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = $this->factory->create($options['om']);
$builder->add(
$builder->create('issue', 'text')
->addModelTransformer($transformer)
);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver
->setDefaults(array(
'data_class' => 'Acme\TaskBundle\Entity\Task',
))
->setRequired(array('om'))
;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment