2011-11-19 5 views
4

Я выполнил документацию, чтобы переопределить регистрационную форму FosUser, и я покажу роли, которые я хочу, как это. Вот моя регистрационная форма.Как переопределить форму регистра FosUser и выбор полей Поля с ролями SYMFONY2

<?php 

namespace My\BlogBundle\Form; 
use My\BlogBundle\Entity\User; 
use Symfony\Component\Form\FormBuilder; 
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType; 

class MyRegisterType extends BaseType 
{ 
public function buildForm(FormBuilder $builder, array $options) 
{ 
    parent::buildForm($builder ,$options); 
    $user = new User(); 
    $builder 
     ->add('roles' ,'choice' ,array('choices'=>$user->getRoles()) ; 

} 

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

И вот мое юридическое лицо.

<?php 

namespace My\BlogBundle\Entity; 

use FOS\UserBundle\Entity\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* My\BlogBundle\Entity\User 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="My\BlogBundle\Entity\UserRepository") 
*/ 
class User extends BaseUser 
{ 
/** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
protected $id; 

protected $roles=array(); 




/** 
*@ORM\OneToMany(targetEntity="Article" ,mappedBy="user") 
*/ 
protected $article; 

/** 
*@ORM\OneToMany(targetEntity="Comment" ,mappedBy="user") 
*/ 
protected $comment; 

public function __construct() 
{ 
    parent::__construct(); 
    $this->roles=array('searcher' ,'annoucer'); 
} 

} 

Моя проблема сейчас я не знаю, как отобразить на этом поле только роли я добавил, потому что я получаю ROLE_USER с выбором также и когда я отправить форму, я получаю эту ошибку

 
Catchable Fatal Error: Argument 1 passed to FOS\UserBundle\Model\User::setRoles() must be an array, string given, called in /var/www/blog/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php on line 346 and defined in /var/www/blog/vendor/bundles/FOS/UserBundle/Model/User.php line 709 

Любая помощь будет более чем оценена, спасибо. BTW Извините, но я не могу добавить другие теги: P

ответ

4

Я думаю, что проблема связана с тем, что вы используете ChoiceField. ChoiceField возвращает только одну роль (тип строки, этот идентификатор роли), но метод setRoles ожидает массив. Это означает, что вам нужно либо добавить опцию multiple => true, либо перейти на другой тип поля, например, поле Collection. Использование multiple вернет массив, который будет принят setRoles, и с помощью поля Collection также будет возвращен массив.

В нижней строке вам нужно выбрать поле формы, которое возвращает массив вместо одного результата, строку. Вы можете просмотреть все типы форм here

Надеюсь, это поможет.

+0

окей спасибо, ребята плохо проверить это, и пусть вы KNO Thanks – kosaidpo

+0

Привет, ребята я тестировал и, к сожалению, это не то, что я хочу, я хочу позволить пользователю выбрать его (тип учетной записи, который его роль sementicly) искатель/аннуитет для работы, любое другое обходное решение ?? спасибо – kosaidpo

+1

Тогда вы должны сохранить свой тип формы, то есть 'ChoiceField', но для этого нужно переопределить класс FOSUserBundle и создать метод с именем' setRole', который получит строку, идентификатор роли, которую вы хотите установить. Затем, добавляя свой тип к своей форме, вместо использования 'role', вы используете' role', а компонент формы будет вызывать 'setRole' с единственным одиночным значением. – Matt

1

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

в форме регистрации

->add('roles', 'choice', array(
       'mapped' => false, 
       'required' => true, 
       'label' => 'User Type', 
       'choices' => array(
        'ROLE_USER' => 'User', 
        'ROLE_STAFF' => 'Staff', 
        'ROLE_INSTITUTE' => 'Institute', 
       ), 
       'expanded' => true, 
      )) 

и контроллер

$role = $form->get('roles')->getData(); 
    $user->setRoles(array($role)); 
    $em->persist($user); 
    $em->flush();