Symfony2 表单集合数组错误
Symfony2 form collection array error
我已经构建了带有角色的用户实体,其中包含用于在数据库中存储角色的字段:
/**
* @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) }}
所以基本的想法是有一个 select 字段,其中包含用户 select 的所有角色,然后更新数据库。但出于某种原因,当我删除
'multiple' => true
我遇到这样的错误...
最好的解决方法是什么?我不想有多项选择,而只有一个。
最后一件事是它没有填充数据库,但我得到了信息,当我在坚持之前调用时,它保存了它们,但不是默认情况下。
$entity->setRoles($entity->getRoles());
你必须转变你的价值观。
您可以构建一个小部件
<?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';
}
}
还有你的数据转换器
<?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');
我已经构建了带有角色的用户实体,其中包含用于在数据库中存储角色的字段:
/**
* @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) }}
所以基本的想法是有一个 select 字段,其中包含用户 select 的所有角色,然后更新数据库。但出于某种原因,当我删除
'multiple' => true
我遇到这样的错误...
最好的解决方法是什么?我不想有多项选择,而只有一个。
最后一件事是它没有填充数据库,但我得到了信息,当我在坚持之前调用时,它保存了它们,但不是默认情况下。
$entity->setRoles($entity->getRoles());
你必须转变你的价值观。
您可以构建一个小部件
<?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';
}
}
还有你的数据转换器
<?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');