我正在努力使用symfony2表单。基本上我想管理用户的偏好,以接收(或不接收)用户可以执行的每种操作类型的电子邮件。
这是我的架构: 用户(扩展FOSUB)
EmailUserPreference
class EmailUserPreference {
public function __construct(User $user, \Adibox\Bundle\ActionBundle\Entity\ActionType $actionType) {
$this->user = $user;
$this->actionType = $actionType;
$this->activated = true;
}
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Adibox\Bundle\UserBundle\Entity\User", inversedBy="id")
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="Adibox\Bundle\ActionBundle\Entity\ActionType", inversedBy="id")
*/
private $actionType;
/**
* @ORM\Column activated(type="boolean")
*/
private $activated;
/*getters / setters ... */
}
操作类型
class ActionType
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $value
*
* @ORM\Column(name="value", type="string", length=255)
*/
private $value;
/* and some others */
}
在这里,我构建了我的表单EmailUserPreferenceType:
class EmailUserPreferenceType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('emailPreference', 'entity', array(
'class' => 'AdiboxActionBundle:ActionType',
'property' => 'value',
'expanded' => true,
'multiple' => true,
'query_builder' => function(\Adibox\Bundle\ActionBundle\Entity\ActionTypeRepository $er) {
return $er->getAllActionsWithPreferences();
}
));
}
public function getName() {
return 'emailUserPreference';
}
public function getDefaultOptions(array $options) {
return array('data_class' => 'Adibox\Bundle\UserBundle\Entity\EmailUserPreference');
}
}
最后是ActionTypeRepository,其函数在FormType中调用:
class ActionTypeRepository extends EntityRepository {
public function getAllActionsWithPreferences() {
$arrayActionWithPreferences = array(
'share',
'refuse',
'validate',
'validatePayment',
'createPayment',
'estimateChangeState',
'comment',
'createRepetition',
'display',
'DAFLate',
);
$qb = $this->createQueryBuilder('a');
$qb->where($qb->expr()->in('a.value', $arrayActionWithPreferences));
return $qb;
}
}
在这一点上,我认为没关系:我有一个很好的渲染,正确的形式。但事实上,每个复选框都具有与另一个相同的表单名称。换句话说,每次提交表单时,它只发送一个$builderemailUserPreference[emailUserPreference][]
数据。显然,它不像我预期的那样有效。
我展示了这些帖子 http://sf.khepin.com/2011/08/basic-usage-of-the-symfony2-collectiontype-form-field/ 在这里,他正在使用一个小部件集合。我不确定我应该使用它还是实体(就像我一样)。但是我可以从http://symfony.com/fr/doc/current/reference/forms/types/collection.html中读到,它看起来更像是一种嵌入形式而非一种实体。
最后我看到了这个:symfony2 many-to-many form checkbox
这个使用(确实)收集和多对多关系。我读到某处(找不到链接)我无法使用它因为我需要为关系添加一些属性(在本例中为bool activated
)。我很确定解决方案是在上面的链接附近,但找不到达到它的好方法。
提前谢谢。
对于我做错了什么或者我应该使用Collections而不是Entity的任何建议都将不胜感激。