Symfony 自定义表单编辑设置内容

Custom Form Editing Setting Conent in 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(),
        );
    }

到目前为止一切正常。 创建用户工作没有问题。 但是编辑它们给我留下了空白字段。 我看不出问题出在哪里。 我很感激任何帮助。

克里斯

P.S.: 我必须将表单分成自定义类型,因为我需要在多个位置重复使用它。 为此,我还将重用表单的树枝部分。 ^^

我刚发现 $form->setData() 对你有用,因为你忘了将 setDefaultOptions 方法添加到你的表单类型中:

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

...

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

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