我会尽量简单地把这个尽可能简单,但基本上我试图达到的是这个。Silverstripe一对一的关系
有两种页面类型与一对一的关系,汽车和车主。我希望能够通过汽车页面上的下拉菜单选择车主。如果车主已经连接到另一辆车,我不希望它出现在下拉列表中。
我知道我需要一个if语句,但我很难找出它应该如何去解决的问题。我跟着这个tutorial来创建下拉菜单,它工作得很好。
在此先感谢。
我会尽量简单地把这个尽可能简单,但基本上我试图达到的是这个。Silverstripe一对一的关系
有两种页面类型与一对一的关系,汽车和车主。我希望能够通过汽车页面上的下拉菜单选择车主。如果车主已经连接到另一辆车,我不希望它出现在下拉列表中。
我知道我需要一个if语句,但我很难找出它应该如何去解决的问题。我跟着这个tutorial来创建下拉菜单,它工作得很好。
在此先感谢。
您可以修改为您提供下拉值的功能。你的DataObject::get()
调用 可以有第二个参数的过滤器。只需选择具有0
所以一个CarID所有业主,从您提供的教程,你可以使用这个修改后的代码:
new DropdownField(
'OwnerID',
'Please choose an owner',
Dataobject::get("Owner","CarID='0'")->map("ID", "Title", "Please Select")
);
2件事情需要注意:
这假设您的DataObjects被称为Car
和Owner
(根据需要进行更改,但将ID保留在名称末尾,如上所述)
这可能无法正常工作,具体取决于您如何与DataObjects上的$has_one
赋值建立关系。如果Owner
表中没有CarID
字段,则此代码不会对您有所帮助(您可能会将其设置为反之亦然)。在这种情况下,您必须创建一个循环遍历所有汽车的函数,然后从该DataObjectSet中删除具有0的OwnerID
的DataObjects。如果没有意义,请添加注释。
对于一种有效的方法,但我认为你错过了一个事实,即即使Owner表上可能有一个CarID字段,它也不会得到更新并且始终具有值0;所以你提到的一些DataObjectSet模糊不清,无法避免 – schellmax 2012-08-07 19:46:22
对我来说是有道理的。我会尽力实施它,让你知道我如何继续。顺便说一句,+1是非常好的答案。 – MillyMonster 2012-08-09 07:36:43
现在我已经遇到了轻微的绊脚石。我使用的所有者表实际上是该网站的注册用户(会员表),所以我不能使用它。我可以做一些像Dataobject :: get(“Owner”,“Car.OwnerID ='0'”)吗? – MillyMonster 2012-08-09 08:11:24
本杰明·史密斯的回答是完全合法你问的下拉列表中,只是想指出另一种方法:而不是采取一比一的关系好好照顾自己,还有的‘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
另一个非常好的方法。其实我不久前就试过这个教程。我只是认为它的布局方式不适合我的用户。如果我无法让我的下拉菜单以我想要的方式工作,我会再看一次。非常感谢。 – MillyMonster 2012-08-09 07:51:20
如果你觉得提出的解决方案似乎为一个相当简单的任务过于复杂 - 你不是一个人:) - 看到核心的讨论开发者在这个问题上:https://groups.google.com/forum/#!msg/silverstripe-dev/d1VH-NT8qcc/gJNPr_WCyvwJ%5B1-25%5D – schellmax 2012-08-08 07:43:27
我似乎无法打开@schellmax链接。它出现空白。我真的很想阅读它。 – MillyMonster 2012-08-09 07:39:39
哎呀,请尝试这一个:https://groups.google.com/d/topic/silverstripe-dev/d1VH-NT8qcc/discussion(你需要有一个谷歌帐户,虽然它是谷歌组) – schellmax 2012-08-09 09:12:40