2015-08-21 70 views
0

設置Conent我創建了下面的自定義表單類型自定義表單編輯在Symfony的

<?php 


    namespace UserBundle\Form\Type; 
    use Doctrine\ORM\EntityManager; 
    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\FormBuilderInterface; 
    use Symfony\Component\HttpFoundation\Request; 
    use UserBundle\Entity\Users; 
    class UserType extends AbstractType 
    { 
     const FORM = 'user'; 
     /** 
     * @var 
     */ 
     protected $UserContext; 

     /** 
     * Construct 
     * @param $uc 
     */ 
     public function __construct($uc) 
     { 
      $this->UserContext = $uc; 
     } 

     /** 
     * Build Form 
     * @param \Symfony\Component\Form\FormBuilderInterface $builder 
     * @param array          $options 
     */ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder->add('username','text',array('label'=>'username')) 
        ->add('password','text',array('label'=>'password')) 
        ->add('firstname','text',array('label'=>'firstname','required'=>false)) 
        ->add('lastname','text',array('label'=>'lastname','required'=>false)) 
        ->add('email','email',array('label'=>'email','required'=>true)); 
      $roles = array(
       'Guest'=>array(
        'ROLE_GUEST'   =>'ROLE_GUEST', 
       ), 
       'Users'=>array(
        'ROLE_USER'    =>'ROLE_USER', 
       ), 
       'Customers'=>array(
        'ROLE_CUSTOMER'   =>'ROLE_CUSTOMER', 
       ), 
      ); 
      if($this->UserContext->isGranted('Role_SUPERVISOR')) 
      { 
       $roles['Staff']['ROLE_STAFF'] = 'ROLE_STAFF'; 
       $roles['Staff']['ROLE_SUPPORT'] = 'ROLE_SUPPORT'; 
      } 
      if($this->UserContext->isGranted('ROLE_ADMIN')) 
      { 
       $roles['Staff']['ROLE_SUPERVISOR'] = 'ROLE_SUPERVISOR'; 
      } 
      if($this->UserContext->isGranted('ROLE_SUPER_ADMIN')) 
      { 
       $roles['Staff']['ROLE_ADMIN'] = 'ROLE_ADMIN'; 
      } 
      if($this->UserContext->isGranted('ROLE_GOD')) 
      { 
       $roles['Staff']['ROLE_SUPER_ADMIN'] = 'ROLE_SUPER_ADMIN'; 
       $roles['Staff']['ROLE_GOD'] = 'ROLE_GOD'; 
      } 
      $builder->add('role','choice',array(
         'choices'=>$roles, 
         'required'=>true, 
         'label'=>'userrole' 
        )) 
        ->add('status','choice',array(
         'choices'=>array(
          '1'=>'account active', 
          '0'=>'account inactive', 
         ), 
         'required'=>true, 
         'label'=>'status' 
        )); 
     } 

     /** 
     * get Form Name 
     * @return string 
     */ 
     public function getName() 
     { 
      return self::FORM; 
     } 

     /** 
     * persist Form 
     * @param \Symfony\Component\HttpFoundation\Request $request 
     * @param \UserBundle\Entity\Users     $user 
     * @param \Doctrine\ORM\EntityManager    $em 
     * 
     * @return \UserBundle\Entity\Users 
     */ 
     public static function storeFormContent(Request $request,Users $user, EntityManager $em) 
     { 
      $formData = $request->request->get(self::FORM); 
      $isNew = (int)$user->getId()<1; 
      $user->setFirstname($formData['firstname']); 
      $user->setLastname($formData['lastname']); 
      $user->setUsername($formData['username']); 
      if(!empty($formData['password']) || $isNew) 
      { 
       $user->setPassword($formData['password']); 
      } 
      $user->setEmail($formData['email']); 
      $user->setRole($formData['role']); 
      $user->setActive($formData['status']); 
      if($isNew) 
      { 
       $em->persist($user); 
      } 
      $em->flush(); 
      return $user; 
     } 
    } 

在我的控制器我加入這個方法來編輯用戶:

/** 
    * @Route("/Administration/Users/Edit", name="admin_users_edit") 
    * @Template() 
    */ 
    public function editAction() 
    { 
     $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!'); 
     $request = Request::createFromGlobals(); 
     $userid = (int)$request->query->get('id', null); 
     if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) { 
      $session = new Session(); 
      $session->start(); 
      $session->set('currentRoute',array('call'=>'admin_users_edit','parameters'=>array('id'=>$userid))); 
      throw $this->createAccessDeniedException(); 
     } 
     $em = $this->getDoctrine()->getManager(); 
     /** @var Users $user */ 
     $user = $this->getDoctrine() 
        ->getRepository('UserBundle\Entity\Users') 
        ->find($userid); 
     if(empty($user) || !($user instanceof Users) || $user->getId() < 0) 
     { 
      return $this->redirectToRoute('admin_users_index', array('status' => 'user_does_not_exist')); 
     } 
     if($user->getRole()=='ROLE_ADMIN') 
     { 
      $this->denyAccessUnlessGranted('ROLE_SUPER_ADMIN', null, 'Unable to access this page!'); 
     } 
     if($user->getRole()=='ROLE_SUPER_ADMIN' or $user->getRole()=='ROLE_GOD') 
     { 
      $this->denyAccessUnlessGranted('ROLE_GOD', null, 'Unable to access this page!'); 
     } 
     if(!($user instanceof Users)) 
     { 
      return $this->redirectToRoute('admin_users_index', array('status' => 'not_found')); 
     } 
     $form = $this->createForm(new UserType($this->get('security.context'),$user)); 
     $form->handleRequest($request); 
     if($form->isValid()) 
     { 
      UserType::storeFormContent($request,$user,$this->getDoctrine()->getManager()); 
      return $this->redirectToRoute('admin_users_index', array('status' => 'create_success')); 
     } 
     return array(
      'activeMenu'=>'users', 
      'error'=>$request->query->get('error'), 
      'form'=>$form->createView(), 
     ); 
    } 

一切工作正常爲止。 創建用戶沒有問題的工作。 但編輯它們會留下空白字段。 我看不到問題來自哪裏。 我appreceate任何幫助。

克里斯

P.S: 我必須將表格單獨成一個自定義類型,因爲我需要重用的多個位置。 我也會重複使用表單的樹枝部分。 ^^

+0

嘗試添加'$形式 - > setData($ user);' – malcolm

+0

謝謝你的幫助。 –

+0

你能發表這個請作爲答覆,所以我可以接受這一點。 –

回答

1

我才發現,原來$form->setData()爲你工作,因爲你忘了setDefaultOptions方法添加到您的表單類型:

use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

... 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'UserBundle\Entity\Users', 
    )); 
} 

您可以刪除$form->setData();