だからまず最初に私はSymfony2.1でFOSUserBundleを使用していて、それは私の役割をユーザーテーブルにロングテキストとして保存します:
a:1:{i:0;s:14:"ROLE_SUPERUSER";}
データを取得して、コントローラーのこのコードを小枝のフォームに送信できます。
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 Internal ServerError-UnexpectedTypeExceptionが与えられた場合にタイプ"array"、"string"のExpected引数が返されます
私が試してみると:print_r(xxx); 印刷コマンドがif($ form-> isValid())の上のどこかで機能するので、フォームが無効になりますか?
また、createFormBuilder-> add('roles' ...このaddをコメントに入れると機能するため、エラーがスローされると確信しています...これは配列の障害です。コントローラーでこれを修正するにはどうすればよいですか?
どんな助けでも大歓迎です!