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');
}
}
最後に、 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;
}
}
この時点で、私はそれでよかったと思いました。適切なフォームで、適切なレンダリングが得られました。しかし、実際には、各チェックボックスは他のものと同じフォーム名を持っています。つまり、フォームが送信されるたびに、投稿$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
。解決策は上記のリンクの近くにあると確信していますが、そこに到達するための良い方法が見つかりません。
前もって感謝します。
私が間違っていること、またはエンティティの代わりにコレクションを使用する必要があるかどうかについてのアドバイスをいただければ幸いです。