Как переопределить регистрационную форму FosUser и поля выбора Filles с ролями SYMFONY2 - PullRequest
4 голосов
/ 20 ноября 2011

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

<?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

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

Ответы [ 2 ]

4 голосов
/ 21 ноября 2011

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

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

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

1 голос
/ 21 ноября 2015

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

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

->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();
...