我正在创建一个web界面,允许用户使用https://github.com/FriendsOfSymfony/FOSUserBundle和CentOS 6.x上的Symfony版本2.7进行分组。
这是我的代码:
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"). )
我有两个问题:
这是我为UserType所拥有的(根据Symfony文档):
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
// 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';
}
}它由控制器调用,如下所示:
$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
我对我的实现并不完全满意,但我认为我会暂时离开它,继续前进。
发布于 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中添加groupgroup表单中添加新字段UserType。并调用$this->group设置choiceTypecontroller在$this->createForm( new UserType(), $user );中修改为$this->createForm( new UserType($group), $user );所以你的UserType应该是:
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
))
;
}在控制器中调用您的表单:
$this->createForm( new UserType($group), $user );发布于 2016-01-30 01:26:09
这就是我现在工作的解决方案。
控制器
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
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'
) );
}https://stackoverflow.com/questions/34100407
复制相似问题