首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FOSUserBundle - UserType形式的组分配

FOSUserBundle - UserType形式的组分配
EN

Stack Overflow用户
提问于 2015-12-05 02:00:19
回答 2查看 520关注 0票数 0

我正在创建一个web界面,允许用户使用https://github.com/FriendsOfSymfony/FOSUserBundle和CentOS 6.x上的Symfony版本2.7进行分组。

这是我的代码:

代码语言:javascript
复制
use FOS\UserBundle\Model\GroupManager;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

/**
 * @Route("/admin/user")
 */
public function indexAction( Request $request )
{
    $this->denyAccessUnlessGranted( 'ROLE_ADMIN', null, 'Unable to access this page!' );

    $groups = $this->get('fos_user.group_manager')->findGroups();
    $groupNames = [];
    foreach ($groups as $g) {
        $groupNames[] = $g->getName();
    }

    $user = new User();
    $user_form = $this->createForm( new UserType(), $user );
    $user_form->add( 'groups', ChoiceType::class, [
        'choices' => $groupNames,
        'choices_as_values' => true,
        'multiple' => false
    ] );

    return $this->render( 'admin/user/index.html.twig', array(
                'user_form' => $user_form->createView(),
                'base_dir' => realpath( $this->container->getParameter( 'kernel.root_dir' ) . '/..' ),
            ) );
}

我在Symfony和Googled上读过文档,但是调试器抛出了一个错误(无法加载类型"Symfony\Component\Form\Extension\Core\Type\ChoiceType"). )

我有两个问题:

  1. 如何将选择字段添加到允许用户选择要分配用户的组的表单中?
  2. 在UserType中添加组选择元素会更好吗?

这是我为UserType所拥有的(根据Symfony文档):

代码语言:javascript
复制
class UserType extends AbstractType
{

    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder
                ->add( 'username' )
                ->add( 'email' )
                ->add( 'enabled', 'checkbox' )
                ->add( 'locked', 'checkbox' )
                ->add( 'expired', 'checkbox' )
                ->add( 'credentialsExpired', 'checkbox' )
        ;
    }

感谢@hendrathing提供了一个比我更好的解决方案。

为了避免将来出现版本问题,我升级到Symfony 3.0。

这就是我最后实现的:

UserType.php

代码语言:javascript
复制
// Additional dependencies ...

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

class UserType extends AbstractType
{

    public function buildForm( FormBuilderInterface $builder, array $data )
    {
        $builder
                ->add( 'username', TextType::class )
                ->add( 'email', TextType::class )
                ->add( 'enabled', CheckboxType::class )
                ->add( 'locked', CheckboxType::class )
                ->add( 'groups', ChoiceType::class, [
                    'choices' => $data['group_names'],
                ] );
    }

    public function configureOptions( OptionsResolver $resolver )
    {
        $resolver->setDefaults( array(
            'data_class' => 'AppBundle\Entity\User',
            'group_names' => []
        ) );
    }

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

}

它由控制器调用,如下所示:

代码语言:javascript
复制
    $groups = $this->get( 'fos_user.group_manager' )->findGroups();
    $groupNames = [];
    foreach( $groups as $g )
    {
        $groupNames[$g->getName()] = $g->getId();
    }
    $user = new User();
    $user_form = $this->createForm( UserType::class, $user, array( 'group_names' => $groupNames ));

这也很有帮助:Pass custom options to a symfony2 form

我对我的实现并不完全满意,但我认为我会暂时离开它,继续前进。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-05 04:24:15

您的symfony版本为2.7,使用symfony 3.0语法。尝试通过composer升级您的symfony。

或将此部分ChoiceType::class更改为choice。并删除use Symfony\Component\Form\Extension\Core\Type\ChoiceType

1.如何在表单中添加选择字段,使用户能够选择将用户分配到哪些组:

  • group实体类中添加新字段User
  • 在传递您的_construct列表(数组)的UserType中添加group
  • group表单中添加新字段UserType。并调用$this->group设置choiceType
  • controller$this->createForm( new UserType(), $user );中修改为$this->createForm( new UserType($group), $user );

所以你的UserType应该是:

代码语言:javascript
复制
private $group;

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

public function buildForm( FormBuilderInterface $builder, array $options )
{
    $builder
            ->add( 'username' )
            ...
            ->add( 'group', 'choice', array(
                'choice' => $this->group
                ... // Your setting
            ))
    ;
}

在控制器中调用您的表单:

代码语言:javascript
复制
$this->createForm( new UserType($group), $user );
  1. 是。使您的代码整洁和理解。
票数 1
EN

Stack Overflow用户

发布于 2016-01-30 01:26:09

这就是我现在工作的解决方案。

控制器

代码语言:javascript
复制
public function indexAction( Request $request )
{
    $this->denyAccessUnlessGranted( 'ROLE_ADMIN', null, 'Unable to access this page!' );

    $user_form = $this->createForm( UserType::class, null, [] );

    return $this->render( 'admin/index.html.twig', array(
                'user_form' => $user_form->createView(),
                'base_dir' => realpath( $this->container->getParameter( 'kernel.root_dir' ) . '/..' ),
            ) );
}    

UserType / Form

代码语言:javascript
复制
public function buildForm( FormBuilderInterface $builder, array $options )
{

    $builder
            ->add( 'username', TextType::class )
            ->add( 'email', TextType::class )
            ->add( 'enabled', CheckboxType::class )
            ->add( 'locked', CheckboxType::class )
            ->add( 'groups', EntityType::class, [
                'class' => 'AppBundle:Group',
                'choice_label' => 'name',
                'multiple' => true,
                'choices_as_values' => true,
                'expanded' => true
            ] );
}

public function configureOptions( OptionsResolver $resolver )
{
    $resolver->setDefaults( array(
        'groups' => [],
        'data_class' => 'AppBundle\Entity\User'
    ) );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34100407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档