5

symfony 2 + FOSUserBundle で新規/編集ユーザーフォームを作成する際に問題があります。管理者がドロップダウン リストまたはラジオ ボタン リストからユーザー ロールを選択できるようにしたいのですが、うまくいきません。ここでこの回答を見つけましたHow can I pass a full security roles list/hierarchy to a FormType class in Symfony2? これは私が見つけることができる最も関連性の高いものですが、機能しません。

これは現在の UserType フォームです。コンテナからロールを取得したいのですが、エラーをスローせずにそれを機能させることができないようです。ロールはドロップダウンに適切に入力されますが、現在割り当てられているロールは表示されず、配列であると予想されたため情報を更新できませんが$entity->addRoles(array('ROLE_SUPER_ADMIN'));、文字列として送信されます。

namespace Wes\AdminBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UserType extends AbstractType
{
    private $roles;

    public function __construct($roles) {
        $this->roles = $roles;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username')
            ->add('email')
            ->add('enabled')
            ->add('roles', 'choice', array(
               'choices' => $this->flattenArray($this->roles),
            ))
            ->add('firstName')
            ->add('lastName')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Wes\AdminBundle\Entity\User',
            'roles' => null,
            'userRole' => null,
        ));
    }

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

    private function flattenArray(array $data)
    {
        $returnData = array();

        foreach($data as $key => $value)
        {
            $tempValue = str_replace("ROLE_", '', $key);
            $tempValue = ucwords(strtolower(str_replace("_", ' ', $tempValue)));
            $returnData[$key] = $tempValue;
        }
        return $returnData;
    }
}

これがコントローラーです。

public function editAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('WesAdminBundle:User')->find($id);
    if (!$entity) {
        throw $this->createNotFoundException('Unable to find User entity.');
    }

    $editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity);
    $deleteForm = $this->createDeleteForm($id);

    return $this->render('WesAdminBundle:User:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}

/**
 * Edits an existing User entity.
 *
 */
public function updateAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('WesAdminBundle:User')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find User entity.');
    }

    $deleteForm = $this->createDeleteForm($id);
    $editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity);
    $editForm->bind($request);

    if ($editForm->isValid()) {
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('wes_admin_user_edit', array('id' => $id)));
    }

    return $this->render('WesAdminBundle:User:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}

私はこれを数日間戦っていますが、適切に機能させることができないようです。何かご意見は?

4

1 に答える 1

3

ロール配列はデータベースに保存する前にシリアル化する必要があるため、カスタム永続化メソッドの代わりにFOSUserBundleが提供するuserManagerを使用してください。

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserBy(array('id' => $id));

$editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $user);

if ($editForm->isValid()) {
    $userManager->updateUser($user);

    return $this->redirect($this->generateUrl('wes_admin_user_edit',
        array('id' => $id)));
}

詳細については、 https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/user_manager.rst(編集済み)を参照してください。

于 2013-01-11T12:20:27.960 に答える