1

Symfony の埋め込みフォームについて質問があります。基本的に私はと呼ばれるフォームを持っていMediaます。Mediaフィールドには、ユーザー画像、製品画像などが保存されます。

メディア スキーム:

Media:
  actAs:
    Timestampable: ~    
  columns:
    entity:
      type: string(60)
      notnull: true
    entity_id:
      type: bigint(20)
      notnull: true
    file:
      type: string(255)
      notnull: true 

ここ、

  • entity = 製品またはユーザーなど
  • entity_id= product_id または user_id など

したがって、エンティティの値を動的に変更したいのは、これらのフォームを呼び出している場所に依存します。

 $this->embedForm('media', new MediaForm());

そこで、ここからフィールドの値を変更したい、または他に良い方法があれば教えてください。

4

1 に答える 1

1

Media オブジェクトを保存するには ID が必要なので、「親」オブジェクトが保存された後に保存できます。あなたが持っている最良のオプションはsaveEmbeddedFroms()メソッドだと思います(MediaFormが埋め込まれている形式で):

public function saveEmbeddedForms($con = null, $forms = null)
{
  if (isset($this->embeddedForms['media']))
  {
    $mediaForm = $this->getEmbeddedForm('media');

    if ($mediaForm instanceof MediaForm && $mediaForm instanceof sfFormDoctrine)
    {
      $mediaFrom
        ->getObject()
        ->set('entity', get_class($this->getObject()))
        ->set('entity_id', $this->getObject()->get('id'))
      ;
    }
  }

  parent::saveEmbeddedForms($con, $forms);
}

実際、これをクラスに入れることもできるBaseFormDoctrineので、MediaForm が埋め込まれたすべてのドクトリンフォームは正しく保存されます。

編集:最後にsfFormObjectが機能します

public function saveEmbeddedForms($con = null, $forms = null)
{
  if (null === $con)
  {
  $con = $this->getConnection();
  }

  if (null === $forms)
  {
  $forms = $this->embeddedForms;
  }

  foreach ($forms as $form)
  {

    if ($form instanceof sfFormObject)
    {
      $form->getObject()->set('entity', get_class($this->getObject()))->set('entity_id', $this->getObject()->get('id'));
    }    


  }
  return parent::saveEmbeddedForms($con, $forms);
}
于 2012-11-03T21:31:33.933 に答える