我有一个事件的 getCMSField_forpopup 表单。我在其中制作了另一个弹出窗口,为该事件提供多个日期(使用 has_many 关系)。当我为事件“A”提供日期 2 个不同的日期/时间,然后在保存事件“A”后,我打开主 getCMSField_forpopup 以输入另一个事件“B”的详细信息,然后我看到实际上已经存在的日期/时间(complextablefield)意味着出现在事件 A 的详细信息中,而不是出现在事件“B”中。我想看到那些只有 A 的人,而不是每个新事件。我怎样才能做到这一点?
1 回答
您的问题是您输入了 1 个事件的日期,但是您可以在每个事件上看到这个日期?
对我来说,这听起来像是您的事件此时没有 ID,因此对日期“WHERE EventID = x”的查询不起作用,或者您的日期在没有事件 ID 的情况下被保存
如果您的日期具有事件集的 ID,您可以简单地检查您的数据库。
如果事件的 ID 为 0,那么问题是您没有保存事件 ID,这或者意味着:
- 您在保存事件之前创建了日期,在这种情况下,解决方案只是在添加日期之前保存事件,您还可以在未保存日期字段时隐藏它,请参见下面的 $this->isNew() 内容
- 或 silverstripe 无法保存 EventID,在这种情况下,您可以通过将隐藏字段添加到日期的 getCMSFields_forPopup 并将事件 ID 保存在那里来修复它,但是将此 ID 放入弹出窗口会有点棘手
如果这不是问题,那么问题是当您创建一个新事件时它没有 ID,因此无法按 ID 过滤,您可以在事件的 getCMSFields_forPopup 中简单地执行此操作:
if (!$this->isNew()) { // add your ComplexTableField for Dates here so it only // gets added if this record has already been saved }
但实际上我建议使用嵌套的 DataObjectManager(DataObjectManager 中的 DataObjectManager)(请参阅 youtube 上的教程:http: //youtu.be/eeXOTlXFmQQ),DataObjectManager 为您完成所有工作,因此不应出现此问题。
如果您已经保存了一次事件,它只会显示日期的 DataObjectManager,否则它会告诉用户他需要先保存它。它还为您设置日期上的事件 ID
或者,更好的是,您可以升级到 SilverStripe 3,您可以在其中使用 GridField。GridField 的工作方式比 DataObjectManager 好得多,而且看起来好多了。