已经在getCMSField_forpopup记录中保存has_many关系,再次出现在SilverStripe中的每个新记录中

时间:2012-08-17 15:04:45

标签: silverstripe

我有一个事件的getCMSField_forpopup表单。我在其中制作了另一个弹出窗口,为该事件提供多个日期(使用has_many关系)。当我向事件“A”提供日期2不同的日期/时间,然后在保存事件“A”之后,我打开主getCMSField_forpopup以输入另一个事件“B”的详细信息然后我看到已经存在的日期/时间(complextablefield)意图出现在事件A的细节中而不是在事件“B”中。我希望看到的只有A而不是每一个新事件。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您的问题是您为1个活动输入日期,但是您可以在每个活动中看到此日期?

对我来说,这听起来好像你的事件目前没有身份证,因此对日期“WHERE EventID = x”的查询不起作用,或者您的日期在没有事件ID的情况下保存

如果您的日期具有事件集的ID,则可以简单地检查您的数据库。

  1. 如果事件的ID是0,那么问题是你没有保存事件ID,这意味着:

    • 您在保存活动之前创建了日期,在这种情况下,解决方案只是在添加日期之前保存事件,您还可以在尚未保存时隐藏日期字段,请参阅下面的$ this-> isNew()的东西
    • 或者silverstripe无法保存EventID,在这种情况下,你可以通过在日期的getCMSFields_forPopup中添加一个隐藏字段并在那里保存事件ID来修复它,但是将这个ID放入弹出窗口会有点棘手< / LI>
  2. 如果这不是问题,那么问题是当你创建一个新的事件时它没有ID,因此不能按ID过滤,你只需在事件的getCMSFields_forPopup中执行此操作: / p>

    if (!$this->isNew()) {
       // add your ComplexTableField for Dates here so it only 
       // gets added if this record has already been saved
    }
    
  3. 但实际上我建议使用嵌套的DataObjectManager(DataObjectManager中的DataObjectManager)(请参阅youtube上的教程:http://youtu.be/eeXOTlXFmQQ),DataObjectManager会为您完成所有工作,因此不应出现此问题。登记/> 如果您已经保存了一次事件,它只显示日期的DataObjectManager,否则它会告诉用户他需要先保存它。 它还会为您设置日期的事件ID

    或者,更好的是,您可以升级到SilverStripe 3,在那里您可以使用GridField。 GridField的工作方式比DataObjectManager更好,看起来更好。