Symfony EmbedForm

时间:2010-11-05 20:50:22

标签: forms symfony1 doctrine embed

这是我的情况,我有3张桌子:学生 | 附件 | 学生 _attachment_ 链路

学生表通过与链接表的classRef关系链接到附件表,就像Student表的Attachment表一样。

relations:
Students:
  class: Student
  refClass: StudentAttachmentLink
  local: attachment_id
  foreign: student_id

relations:
Attachments:
  class: Attachment
  refClass: StudentAttachmentLink
  local: student_id
  foreign: attachment_id

所以我们希望将附件表格嵌入到学生表格中,以便在编辑学生时我可以选择上传新文件(附件)

我已经浏览了一个有一个很棒的例子Here

的文档

在这个例子中,他们设置了一个子表单,然后通过将当前对象设置为正在设置的新对象将表单绑定在一起:

public function configure()
{
  $subForm = new sfForm();
  for ($i = 0; $i < 2; $i++)
  {
    $productPhoto = new ProductPhoto();
    $productPhoto->Product = $this->getObject();

    $form = new ProductPhotoForm($productPhoto);

    $subForm->embedForm($i, $form);
  }
  $this->embedForm('newPhotos', $subForm);
}

您可以在此示例中看到$ productPhoto-&gt; Product = $ this-&gt; getObject();
建立要维护的关系

现在我所知道的秘密是,这是多对一的关系,但我有很多对,所以我做以下事情:

  public function configure()
  {
      $attachment = new Attachment();
      $attachment->Student = $this->getObject();

      $form = new AttachmentForm($attachment);
      $this->embedForm('newFile',$form);
  }

这会产生错误: 无法调用Doctrine_Core :: set(),在设置多对多引用时,第二个参数应该是Doctrine_Collection的实例。

我显然很困惑,因为我认为我的对象是一个Doctrine_Collection,非常感谢任何帮助!

更新
也许我在问一个错误的问题或解决只是部分相关的单点故障。我想要做的是能够添加/删除学生表单中的附件,并使其与该学生相关,而无需自定义formAction和save()操作。我发现使用Symfony 1.4我可以使用:

$this->embedRelation('Attachments');

这项工作非常适合大部分编辑,我仍然需要使用它,但我无法添加或删除学生表格中的附件,当然所需的结果是能够完全控制来自学生表单的附件,即添加/删除/更新附件。

此外,欢迎任何有关更好方法的建议,即我的学生表格中是否只有一个“添加附件”链接,将我带到附件/新页面,但如果我这样做,我该如何通过它是当前的学生,所以选项可以自动化...我有很多东西需要学习这个框架: - /

2 个答案:

答案 0 :(得分:0)

我认为如果你为你的关系使用正确的命名,你会很快理解这个问题:

relations:
  Students:
    refClass: StudentAttachmentLink
    local: attachment_id
    foreign: student_id

relations:
  Attachments:
    refClass: StudentAttachmentLink
    local: student_id
    foreign: attachment_id

标记“s”'。这是一对多关系。您使用的示例是一对多的关系。

答案 1 :(得分:0)

与上一个答案一样,你不能嵌入一个有多对多关系的表格,也许你需要将关系改为多对一,因为我不认为一个附件属于很多学生,但如果是例如,你不能像symfony文档示例那样在学生中嵌入附件,但你可以遵循:

http://di-side.com/di-side/services/web-solutions/symfony-embedrelation-many-to-many-doctrine-relations/

如果您更改了关系,您可以使用本教程,其中包含jquery函数,用于将一个表单或一个表单的一部分嵌入到另一个表单中

http://tech.cibul.net/embedded-forms-with-symfony-1-4-and-jquery/