2013-09-26 3 views
2

Мне нужна помощь, переопределяющая FormFactory. Моя цель - изменить профиль. Поэтому, поскольку я также использую Facebook Login, я не хочу, чтобы они меняли адрес электронной почты, имя пользователя и пароль. Итак, я использую ProfileController в своем пакете, чтобы передать текущего пользователя классу ProfileFormType.FOS UserBundle - переопределить FormFactory

Что я пытаюсь сделать, это реализовать собственный FormFactory, так что я могу установить пользователь и поместить его в массив параметров внутри вызова

return $this->formFactory->createNamed($this->name, $this->type, null, array('validation_groups' => $this->validationGroups, 'user' => $this->user)); 

Для достижения этой цели, я должен определить мой FormFactory в sevices.yml.

Вот оригинал один из FOSUserBundle:

<service id="fos_user.profile.form.factory" class="FOS\UserBundle\Form\Factory\FormFactory"> 
     <argument type="service" id="form.factory" /> 
     <argument>%fos_user.profile.form.name%</argument> 
     <argument>%fos_user.profile.form.type%</argument> 
     <argument>%fos_user.profile.form.validation_groups%</argument> 
    </service> 

У меня есть трудности, чтобы перевести это в YML, так как я не понимаю обычаев псевдонимами полностью.

Не могли бы вы помочь мне определить его правильно? Что-то вроде

skt_user.profile.form.factory: 
    class: SKT\UserBundle\Form\Factory\FormFactory 
    arguments: ??? 
+0

Пожалуйста, не редактируйте свой вопрос с помощью * "[resolved]" *. Вместо этого напишите ответ, разместив код, который вам помог, затем нажмите на большой зеленый галочку рядом с вашим ответом, чтобы отметить его как * «разрешен» * – Touki

ответ

2

Смешно, после публикации, я нашел решение. Это правильная конфигурация для моего FormFactory:

skt_user.profile.form.factory: 
    class: SKT\UserBundle\Form\Factory\FormFactory 
    arguments: ["@form.factory", "%fos_user.profile.form.name%", "%fos_user.profile.form.type%", "%fos_user.profile.form.validation_groups%"] 

В мой контроллер, я просто использовал эти 2 строки:

$formFactory = $this->container->get('skt_user.profile.form.factory'); 
$formFactory->setUser($user); 

на заводе, я реализовал эту функцию

namespace SKT\UserBundle\Form\Factory; 

use Symfony\Component\Form\FormFactoryInterface; 
use FOS\UserBundle\Form\Factory\FactoryInterface; 

class FormFactory implements FactoryInterface 
{ 
    private $formFactory; 
    private $name; 
    private $type; 
    private $validationGroups; 
    private $user; 

    public function __construct(FormFactoryInterface $formFactory, $name, $type, array $validationGroups = null) 
    { 
    $this->formFactory  = $formFactory; 
    $this->name    = $name; 
    $this->type    = $type; 
    $this->validationGroups = $validationGroups; 
    } 

    public function createForm() 
    { 
    return $this->formFactory->createNamed($this->name, $this->type, null, array('validation_groups' => $this->validationGroups, 'user' => $this->user)); 
    } 

    public function setUser($user) 
    { 
    $this->user = $user; 
    } 
} 

и так выглядит мой вид формы

<?php 

namespace SKT\UserBundle\Form\Type; 

use SKT\CaromBundle\Repository\PlayerRepository; 
use Symfony\Component\Form\FormBuilderInterface; 
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class ProfileFormType extends \FOS\UserBundle\Form\Type\ProfileFormType 
{ 

    private $class; 

    /** 
    * @param string $class The User class name 
    */ 
    public function __construct($class) 
    { 
    $this->class = $class; 
    } 


    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    // Do not show email and username if login uses facebook 
    if (!$options['user']->getFacebookId()) { 
    $builder 
     ->add('email', 'email', array('label' => 'form.email', 'translation_domain' => 'FOSUserBundle')) 
     ->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle')); 
    } 

    $builder 
     ->add('firstname', null, array('label' => 'Vorname')) 
     ->add('lastname', null, array('label' => 'Nachname')) 
     ->add('player', 'entity', array(
     'label'   => 'Spieler', 
     'class'   => 'SKTCaromBundle:Player', 
     'property'  => 'name', 
     'query_builder' => function (PlayerRepository $er) { 
      return $er->createQueryBuilder('p') 
      ->orderBy('p.name', 'ASC'); 
     }, 
     'empty_value' => 'Verbinde Dich mit einem Spieler', 
     'required'  => false, 
    )); 
    } 

    public function getName() 
    { 
    return 'skt_user_profile'; 
    } 


    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
    $resolver->setDefaults(array(
     'data_class' => $this->class, 
     'intention' => 'profile', 
     'user' => null 
    )); 
    } 
} 

работает отлично!

+0

На самом деле вы не переопределили фабрику форм, вы просто используете другую, которая является полной копией/вставкой того, который вы хотели бы переопределить – julestruong

Смежные вопросы