使用一对多对一实体生成symfony2表单

时间:2013-09-11 07:49:54

标签: php forms symfony doctrine-orm

我正在努力使用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的任何建议都将不胜感激。

0 个答案:

没有答案