2015-10-07 131 views
0

我建立用戶實體與具有場的角色存儲在數據庫中的角色:Symfony2的形式收集陣列錯誤

/** 
    * @var array 
    * @ORM\Column(name="roles", type="json_array") 
    */ 
    private $roles = array(); 

    public function getRoles() 
    { 
     $roles = $this->roles; 
     $roles[] = 'ROLE_USER'; 

     return array_unique($roles); 
    } 

    public function setPassword($password) 
    { 
     $this->password = $password; 

     return $this; 
    } 

它存儲與數據庫中的一個陣列。這是建立在教程上的。我意識到,如果它像數據庫中的數組,它將需要在表單構建器中成爲一個集合嗎?下面是代碼:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('username') 
     ->add('password') 
     ->add('plainPassword', 'repeated', array('type' => 'password', 'required' => false)) 
     ->add('roles', 'choice', array(
      'choices' => array(
       'ROLE_USER' => 'ROLE_USER', 
       'ROLE_ADMIN' => 'ROLE_ADMIN' 
      ), 
      'multiple' => true, 
     )) 
     ->add('isActive') 
     ->add('mail'); 
} 

末樹枝渲染

{{ form_widget(edit_form.roles) }} 

所以基本想法是有一個選擇欄的所有角色時選擇用戶,然後更新數據庫。但由於某些原因,當我刪除

'multiple' => true 

我得到了這樣的錯誤...

enter image description here

什麼是這裏最好的解決辦法?我不想有多種選擇,但只有一種選擇。

最後一件事是它沒有填充數據庫,但我得到的信息,當我打電話之前堅持它保存它們,但沒有默認。

$entity->setRoles($entity->getRoles()); 

回答

1

您必須改變您的值。

你可以建立一個widget

<?php 

namespace Atix\UserBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Atix\UserBundle\Form\DataTransformer\RolesFormDataTransformer; 

class RolesFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new RolesFormDataTransformer(); 
     $builder->add('roles', 'choice', array(
      'choices' => array(
          'ROLE_P1'  => 'Role p1', 
          'ROLE_RESPONSABLE' => 'Role responsable', 
          'ROLE_ADMIN'    => 'Role admin', 
          ), 
      'label' => false, 
      'required' => false 
     ))->addModelTransformer($transformer); 

    } 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     // $resolver->setDefaults(array(
     //  'data_class' => '', 
     //)); 
    } 

    public function getName() 
    { 
     return 'roles_widget'; 
    } 
} 

而且你datatransformer

<?php 

namespace Atix\UserBundle\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class RolesFormDataTransformer implements DataTransformerInterface 
{ 
    /** 
    * Transforms an array to a string. 
    * POSSIBLE LOSS OF DATA 
    * 
    * @return string 
    */ 
    public function transform($array) 
    { 
     if (empty($array)) { 
      return $array; 
     } 

     $newArray = array(); 
     $newArray["roles"] = $array; 

     return $newArray; 
    } 

    /** 
    * Transforms a string to an array. 
    * 
    * @param string $string 
    * 
    * @return array 
    */ 
    public function reverseTransform($array) 
    { 

     //var_dump($string); 
     $aRoles = array(); 
     foreach($array as $allValue) 
     { 
      foreach($allValue as $value) 
      { 
       $aRoles[] = $value; 
      } 
     } 
     return $aRoles; 
    } 
} 

您在服務

user.form.type.roles: 
    class: Atix\UserBundle\Form\Type\RolesFormType 
    tags: 
     - { name: form.type, alias: roles_widget } 

您現在可以叫你小部件像這樣

聲明形式
$builder->add('roles', 'roles_widget'); 
+0

我明白了你的觀點。非常感謝! :) –