2

我正在为 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 的建议将不胜感激。

4

0 回答 0