私はSymfony 2.8.9でSonata Adminを使用しています。Sonata Adminでは、sonata_type_collectionのマッピングされていないフィールドを取得する方法埋め込み管理者
2つのエンティティ:スキルとスキルステップ。スキルはスキルステップと1対1の関係を持っています。
スキル管理者には、複数のスキルステップ管理者が組み込まれたsonata_type_collectionフィールドがあります。
各スキルステップ管理者には、「データ」というマップされていないテキストフィールドがあります。 SkillStepエンティティの値に直接マップされません。
ユーザーがスキルを保存または更新するとき、sonata_type_collectionの各スキルステップ管理者の「データ」フィールドへの入力に基づいて任意のコードを実行したいとします。
スキルステップ管理者の場合、これを実行する明白な場所はprePersist()
とpreUpdate()
です。しかし、
sonata_type_admin
フィールドタイプを使用して、たとえば、別の内の1つの管理を埋め込む、子供は管理者のフックは解雇されていません。私はトップレベルのエンティティを保存するときにsonata_type_collectionに埋め込まれた管理者のマップされていないフィールドを操作するにはどうすればよい
?それは、これらのマップされていないフィールドは、彼らがにいる管理者のオブジェクトに関連付けられていることが重要である
関連するコード:
# Entity/Skill.php
class Skill {
/**
* @ORM\OneToMany(targetEntity="SkillStep", mappedBy="skill")
*/
private $steps;
// ...
}
# Entity/SkillStep.php
class SkillStep {
/**
* @ORM\ManyToOne(targetEntity="Skill")
* @ORM\JoinColumn(name="skill_id", referencedColumnName="id")
**/
protected $skill;
// ..
}
# Admin/SkillAdmin.php
class SkillAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('name')
->add('steps', 'sonata_type_collection',
['required' => false, 'label' => 'Manage the skill steps'],
['edit'=>'inline','inline'=>'standard']
)
;
}
}
# Admin/SkillStepAdmin.php
class SkillStepAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper) {
$formMapper
->add('name')
->add('route')
->add('data', 'textarea', [
'mapped' => false,
'data' => $step_data,
])
;
}
// Before a new skill step is saved
public function prePersist($skill_step) {
// THIS IS NEVER CALLED BECAUSE THIS ADMIN IS EMBEDDED
}
// Before an existing skill step is updated
public function preUpdate($skill_step) {
// THIS IS NEVER CALLED BECAUSE THIS ADMIN IS EMBEDDED
}
}
:あなたはこのような何か(この作品を作るためにあなたのサービスIDと
skill_step_admin_service_id
を置き換え)を行うことができますあなたの例についてはthis example in the official documentationとthe related issue entryをチェックprePersistリスナー、おそらくあなたdoctrine prePersistとpreUpdateイベントを介して行うことができますか? http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html。または、あなたはSkillAdmin prePersistとpreUpdateメソッドでそれを行うことができますか? –