I need to transform a user name to a user entity, and I'm using this transformation in many form,every form need some specific test to the returned user entity.
In the registration form a user can enter a referral code (user name) or leave this empty, the referral code must have the role ROLE_PARTNER.
In the dashboard a partner can append some user to his account: in this case the user name can't be empty, the user must have the role ROLE_CLIENT and the partner can't enter his own user name
this is my data transformer class
class UserToNameTransformer implements DataTransformerInterface
{
private $om;
private $role;
private $acceptEmpty;
private $logged;
public function __construct(ObjectManager $om,$role,$acceptEmpty,$logged)
{
$this->om = $om;
$this->role=$role;
$this->acceptEmpty=$acceptEmpty;
$this->logged=$logged;
}
public function transform($user)
{
if (null === $user) {
return "";
}
return $user->getUsername();
}
public function reverseTransform($username)
{
if (!$username) {
if ($this->acceptEmpty)
return null;
else
throw new TransformationFailedException(sprintf(
'user name can\'t be empty!'
));
}
$user = $this->om
->getRepository('FMFmBundle:User')
->findOneBy(array('username' => $username))
;
if (null === $user) {
throw new TransformationFailedException(sprintf(
'user with user name "%s" not found!',
$username
));
}
else if (!$user->hasRole($this->role)){
throw new TransformationFailedException(sprintf(
'user name "%s" is not valid',
$username
));
}
else if($this->logged==true){
$activeUser=$this->get('security.context')->getToken()->getUser();
if($user===$activeUser)
throw new TransformationFailedException(sprintf(
'you can\'t enter you user name'
));
}
else
return $user;
}
}
Form type
this form work fine because I'm not using the custom field
class ActivatePartnerType extends AbstractType
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('user','text', array(
'invalid_message' => 'That is not a valid username',
'label' => 'Partner Username :',
))
->add('next','submit')
;
$builder->get('user')
->addModelTransformer(new UserToNameTransformer($this->entityManager,'ROLE_PARTNER',false,true));
}
public function getName()
{
return 'fm_fmbundle_activate_partner';
}
}
The custom field type
class UserSelectorType extends AbstractType
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new UserToNameTransformer($this->entityManager,**{others parametres}**);
$builder->addModelTransformer($transformer);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'invalid_message' => 'The selected user does not exist'
));
}
public function getParent()
{
return 'text';
}
public function getName()
{
return 'user_selector';
}
}
the custom field service
FmarketUserSelector:
class: FM\FmBundle\Form\UserSelectorType
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: form.type, alias: user_selector }
the form type
class ActivatePartnerType extends AbstractType
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('user','user_selector')
->add('next','submit')
;
}
public function getName()
{
return 'fm_fmbundle_activate_partner';
}
}