所以首先我在 Symfony2.1 中使用 FOSUserBundle 并将我的角色作为长文本存储在用户表中:
a:1:{i:0;s:14:"ROLE_SUPERUSER";}
我能够检索数据并将其发送到 twig bij 中的表单,此代码在控制器中:
public function editUserAction($userId) {
$User = $this->container->get('fos_user.user_manager')
->findUserBy(array('id' => $userId))
;
$selectedRole = $User->getRoles();
if($selectedRole[0] == 'ROLE_DISTRICTINHABITANT') {
$selectedRoleNumber = 0;
} elseif($selectedRole[0] == 'ROLE_DISTRICTWORKER') {
$selectedRoleNumber = 1;
} elseif($selectedRole[0] == 'ROLE_CITYWORKER') {
$selectedRoleNumber = 2;
} elseif($selectedRole[0] == 'ROLE_ADMIN') {
$selectedRoleNumber = 3;
} elseif($selectedRole[0] == 'ROLE_SUPERADMIN') {
$selectedRoleNumber = 4;
}
$form = $this->createFormBuilder($User)
->add('username', 'text')
->add('email', 'email')
->add('enabled', 'checkbox', array('required' => false))
->add('roles', 'choice', array(
'choices' => array(
0 => 'DistrictInhabitant',
1 => 'DistrictWorker',
2 => 'CityWorker',
3 => 'Admin',
4 => 'SuperAdmin',
),
'data' => $selectedRoleNumber
))
->getForm();
return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
'form' => $form->createView(),
'user' => $User,
));
}
但是当我尝试通过另一个函数将这些数据保存到数据库时,我没有过去:
if ($form->isValid())
这是我似乎不起作用的完整功能:
public function editUserToDatabaseAction($userId) {
$request = $this->get('request');
$em = $this->getDoctrine()->getEntityManager();
$User = $this->container->get('fos_user.user_manager')
->findUserBy(array('id' => $userId))
;
$form = $this->createFormBuilder($User)
->add('username', 'text')
->add('email', 'email')
->add('enabled', 'checkbox')
->add('roles', 'choice', array(
'choices' => array(
'DistrictInhabitant' => 'DistrictInhabitant',
'DistrictWorker' => 'DistrictWorker',
'CityWorker' => 'CityWorker',
'Admin' => 'Admin',
'SuperAdmin' => 'SuperAdmin',
)
))
->getForm();
if ($request->getMethod() == 'POST') {
$form->bind($this->getRequest());
if ($form->isValid()) {
$em->flush();
return $this->redirect($this->generateUrl('_users'));
}
}
}
整个控制器类:
<?php
namespace SocialGeo\BackendBundle\Controller;
use SocialGeo\BackendBundle\Form;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use SocialGeo\UserBundle\Entity\User;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
class UsersController extends Controller {
public function indexAction() {
$Users = $this->container->get('fos_user.user_manager')
->findUsers()
;
if (!$Users) {
throw $this->createNotFoundException('No users found!');
}
return $this->render('SocialGeoBackendBundle:Users:index.html.twig', array('users' => $Users));
}
public function changeActiveStateAction($id) {
$em = $this->getDoctrine()->getManager();
$selectedUser = $this->container->get('fos_user.user_manager')
->findUserBy(array('id' => $id));
$active = $selectedUser->isEnabled();
if($active) {
$selectedUser->setEnabled(FALSE);
} else {
$selectedUser->setEnabled(TRUE);
}
$em->flush();
return $this->redirect($this->generateUrl('_users'));
}
public function editUserAction($userId) {
$User = $this->container->get('fos_user.user_manager')
->findUserBy(array('id' => $userId))
;
$selectedRole = $User->getRoles();
if($selectedRole[0] == 'ROLE_DISTRICTINHABITANT') {
$selectedRoleNumber = 0;
} elseif($selectedRole[0] == 'ROLE_DISTRICTWORKER') {
$selectedRoleNumber = 1;
} elseif($selectedRole[0] == 'ROLE_CITYWORKER') {
$selectedRoleNumber = 2;
} elseif($selectedRole[0] == 'ROLE_ADMIN') {
$selectedRoleNumber = 3;
} elseif($selectedRole[0] == 'ROLE_SUPERADMIN') {
$selectedRoleNumber = 4;
}
$form = $this->createFormBuilder($User)
->add('username', 'text')
->add('email', 'email')
->add('enabled', 'checkbox', array('required' => false))
->add('roles', 'choice', array(
'choices' => array(
0 => 'DistrictInhabitant',
1 => 'DistrictWorker',
2 => 'CityWorker',
3 => 'Admin',
4 => 'SuperAdmin',
),
'data' => $selectedRoleNumber
))
->getForm();
return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
'form' => $form->createView(),
'user' => $User,
));
}
public function editUserToDatabaseAction($userId) {
$request = $this->get('request');
$em = $this->getDoctrine()->getEntityManager();
$User = $this->container->get('fos_user.user_manager')
->findUserBy(array('id' => $userId))
;
$form = $this->createFormBuilder($User)
->add('username', 'text')
->add('email', 'email')
->add('enabled', 'checkbox')
->add('roles', 'choice', array(
'choices' => array(
'DistrictInhabitant' => 'DistrictInhabitant',
'DistrictWorker' => 'DistrictWorker',
'CityWorker' => 'CityWorker',
'Admin' => 'Admin',
'SuperAdmin' => 'SuperAdmin',
),
'empty_value' => false, // user always has at least the default role
'multiple' => true,
))
->getForm();
if ($request->getMethod() == 'POST') {
$form->bind($this->getRequest());
if ($form->isValid()) {
print_r(jej);
//$data = $form->getData();
$em->flush();
return $this->redirect($this->generateUrl('_users'));
}
}
}
}
因此,当我尝试更新时,我得到一个“数组”、“字符串”类型的预期参数,给出 500 内部服务器错误 - UnexpectedTypeException
当我尝试时: print_r(xxx); 我让打印命令在 if ($form->isValid()) 上方的任何地方工作,所以我的表单无效?
另外:我确定 createFormBuilder ->add('roles' ... 会引发错误,因为当我将此添加添加到注释中时,它会起作用...这是数组的错,我该如何在控制器中解决这个问题?
任何帮助将不胜感激!