2

所以首先我在 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' ... 会引发错误,因为当我将此添加添加到注释中时,它会起作用...这是数组的错,我该如何在控制器中解决这个问题?

任何帮助将不胜感激!

4

2 回答 2

2

编辑以下添加完整的控制器代码到问题:

这里不是尝试诊断特定错误,而是使用角色编辑 FOS 用户的操作示例,涵盖 GET 和 POST(您只需要一个路由/操作,因此您需要更新您的路由)

public function editUserAction($userId) {
    $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 one role
            'multiple' => true,
        ))
        ->getForm();

    if ($this->getRequest()->getMethod() == 'POST') {

        $form->bind($this->getRequest());

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->flush();
            return $this->redirect($this->generateUrl('_users'));
        }
    }

    return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
            'form' => $form->createView(),
            'user' => $user,
        ));
}

我不能保证这是没有错误的,但希望它足以帮助您实现工作版本。

于 2012-11-14T19:07:27.493 回答
0

最后我找到了解决方案。首先,我将post树枝中的我设置为相同的路线(在我的控制器中进行相同的操作)。然后我FOSUserBundle在请求 post 方法时使用了设置器,最后updateUser完成了工作。

这是我的控制器中单个操作的代码:

public function editUserAction($userId) {
    $request = $this->get('request');

    $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();

    if ($request->isMethod('POST')) {


        $postData = $request->request->get('form');
        $roles_value = $postData['roles'];

        if($roles_value == 0) {
            $FutureRole[0] = "ROLE_DISTRICTINHABITANT";
        } else if($roles_value == 1) {
            $FutureRole[0] = "ROLE_DISTRICTWORKER";
        } else if($roles_value == 2) {
            $FutureRole[0] = "ROLE_CITYWORKER";
        } else if($roles_value == 3) {
            $FutureRole[0] = "ROLE_ADMIN";
        } else if($roles_value == 4) {
            $FutureRole[0] = "ROLE_SUPERADMIN";
        }

        $userManager = $this->container->get('fos_user.user_manager');

        $selectedUser = $userManager->findUserBy(array('id' => $userId));

        $selectedUser->setUsername($postData['username']);
        $selectedUser->setEmail($postData['email']);
        $selectedUser->setEnabled($postData['enabled']);
        $selectedUser->setRoles($FutureRole);

        $userManager->updateUser($selectedUser, true);

        return $this->redirect($this->generateUrl('_users'));

    } else {
        return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
            'form' => $form->createView(),
            'user' => $User,
        ));
    }
} 
于 2012-11-26T22:07:58.377 回答