2

だからまず最初に私は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をコメントに入れると機能するため、エラーがスローされると確信しています...これは配列の障害です。コントローラーでこれを修正するにはどうすればよいですか?

どんな助けでも大歓迎です!

4

2 に答える 2

2

質問へのフルコントローラーコードの追加に続いて編集:

特定のエラーを診断しようとするのではなく、GET と POST の両方をカバーする FOS ユーザーをロールで編集するアクションの例を次に示します (必要なルート/アクションは 1 つだけなので、ルーティングを更新する必要があります)。

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 に答える