我正在为 symfony2 表单而苦苦挣扎。基本上,我想管理用户对用户可以执行的每种操作类型的接收(或不接收)电子邮件的偏好。
这是我的架构:用户(扩展 FOSUB)
电子邮件用户偏好
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');
}
}
最后是带有在 FormType 中调用的函数的 ActionTypeRepository :
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;
}
}
在这一点上,我认为没关系:我得到了一个很好的渲染,具有正确的形式。但实际上,每个复选框都具有相同的表单名称。换句话说,每次提交表单时,它只会在 post 中发送一个$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 多对多表单复选框
这一个正在使用(确实)集合和多对多关系。我在某处(无法再找到链接)读到我无法使用它,因为我需要向关系添加一些属性(在这种情况下bool activated
)。我很确定解决方案在上面的链接附近,但找不到达到它的好方法。
先感谢您。
任何关于我做错了什么或者我是否应该使用 Collections 而不是 Entity 的建议将不胜感激。