【问题标题】:Dynamically change the embedd form field value - Symfony 1.4动态更改嵌入表单字段值 - Symfony 1.4
【发布时间】:2012-11-02 10:01:45
【问题描述】:

我有一个关于 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 or user_id or etc

所以,我想动态更改实体值取决于我在哪里调用这些表单。

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

所以,我想从这里更改字段值,或者如果有更好的方法,请告诉我。

【问题讨论】:

  • 您想在提交表单后或在将表单呈现给用户进行创建/修改时更改嵌入表单字段的值吗?
  • @pankar:是的,您的正确我想在提交表单后更改嵌入表单的字段。因为不仅我会得到实体 id,比如(用户 id,产品 id)。
  • 我认为你应该重写父表单的doSave()(你需要从父表单复制代码)或saveEmbeddedForms()(不需要复制)方法。
  • @1ed:你能给我示例或伪代码作为答案吗?

标签: symfony1 symfony-1.4


【解决方案1】:

为了保存媒体对象,需要一个 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);
}

【讨论】:

  • 我收到错误,例如 $mediaFrom 在 $mediaFrom->getObject() 行上未定义。你有什么线索吗。请帮帮我
  • meda 表单应该嵌入到 configure 方法中($this->embedForm('media', new MediaForm());)。我不知道它怎么可能是未定义的,因为有一个isset($this->embeddedForms['media']) 调用来检查它是否已定义。嵌入的MediaForm 应该是学说形式的后代(sfFromDoctrine 或实际上是学说生成的BaseMediaFrom)。我也更新了我的答案以检查这一点。
  • @led:我仍然收到未定义的错误。虽然我是 echo getEmbeddedForm 输出,但它只是返回完整的媒体形式而不是对象。所以我想可能有问题。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
相关资源
最近更新 更多