2012-08-07 92 views
1

我会尽量简单地把这个尽可能简单,但基本上我试图达到的是这个。Silverstripe一对一的关系

有两种页面类型与一对一的关系,汽车和车主。我希望能够通过汽车页面上的下拉菜单选择车主。如果车主已经连接到另一辆车,我不希望它出现在下拉列表中。

我知道我需要一个if语句,但我很难找出它应该如何去解决的问题。我跟着这个tutorial来创建下拉菜单,它工作得很好。

在此先感谢。

+0

如果你觉得提出的解决方案似乎为一个相当简单的任务过于复杂 - 你不是一个人:) - 看到核心的讨论开发者在这个问题上:https://groups.google.com/forum/#!msg/silverstripe-dev/d1VH-NT8qcc/gJNPr_WCyvwJ%5B1-25%5D – schellmax 2012-08-08 07:43:27

+0

我似乎无法打开@schellmax链接。它出现空白。我真的很想阅读它。 – MillyMonster 2012-08-09 07:39:39

+0

哎呀,请尝试这一个:https://groups.google.com/d/topic/silverstripe-dev/d1VH-NT8qcc/discussion(你需要有一个谷歌帐户,虽然它是谷歌组) – schellmax 2012-08-09 09:12:40

回答

2

您可以修改为您提供下拉值的功能。你的DataObject::get()调用 可以有第二个参数的过滤器。只需选择具有0

所以一个CarID所有业主,从您提供的教程,你可以使用这个修改后的代码:

new DropdownField(
    'OwnerID', 
    'Please choose an owner', 
    Dataobject::get("Owner","CarID='0'")->map("ID", "Title", "Please Select") 
); 

2件事情需要注意:

  • 这假设您的DataObjects被称为CarOwner(根据需要进行更改,但将ID保留在名称末尾,如上所述)

  • 这可能无法正常工作,具体取决于您如何与DataObjects上的$has_one赋值建立关系。如果Owner表中没有CarID字段,则此代码不会对您有所帮助(您可能会将其设置为反之亦然)。在这种情况下,您必须创建一个循环遍历所有汽车的函数,然后从该DataObjectSet中删除具有0的OwnerID的DataObjects。如果没有意义,请添加注释。

+0

对于一种有效的方法,但我认为你错过了一个事实,即即使Owner表上可能有一个CarID字段,它也不会得到更新并且始终具有值0;所以你提到的一些DataObjectSet模糊不清,无法避免 – schellmax 2012-08-07 19:46:22

+0

对我来说是有道理的。我会尽力实施它,让你知道我如何继续。顺便说一句,+1是非常好的答案。 – MillyMonster 2012-08-09 07:36:43

+0

现在我已经遇到了轻微的绊脚石。我使用的所有者表实际上是该网站的注册用户(会员表),所以我不能使用它。我可以做一些像Dataobject :: get(“Owner”,“Car.OwnerID ='0'”)吗? – MillyMonster 2012-08-09 08:11:24

1

本杰明·史密斯的回答是完全合法你问的下拉列表中,只是想指出另一种方法:而不是采取一比一的关系好好照顾自己,还有的‘HasOneComplexTableField’处理这个给你。

使用下面的代码为您的汽车类:

class Car extends Page { 
    public static $has_one = array(
     'Owner' => 'Owner' 
    ); 
    function getCMSFields() { 
     $fields = parent::getCMSFields(); 
     $tablefield = new HasOneComplexTableField(
      $this, 
      'Owner', 
      'Owner', 
      array(
       'Title' => 'Title' 
      ) 
     ); 
     $tablefield->setParentClass('Car'); 
     $tablefield->setOneToOne(); 
     $tablefield->setPermissions(array()); 
     $fields->addFieldToTab('Root.Content.Owner', $tablefield); 
     return $fields; 
    } 
} 

注意“setOneToOne()”电话,告诉了tablefield只让你选择哪一个不是已经在另一辆车选房东。

您将在silverstripe教程中找到更多相关信息:http://doc.silverstripe.org/framework/en/tutorials/5-dataobject-relationship-management

+0

另一个非常好的方法。其实我不久前就试过这个教程。我只是认为它的布局方式不适合我的用户。如果我无法让我的下拉菜单以我想要的方式工作,我会再看一次。非常感谢。 – MillyMonster 2012-08-09 07:51:20