我会尽量简单地说明这一点,但基本上我想要实现的就是这个。
有两种具有一对一关系的页面类型,汽车和所有者。我希望能够通过汽车页面上的下拉菜单选择车主。如果车主已经链接到另一辆车,我不希望它出现在下拉列表中。
我知道我需要一个 if 语句,但我发现很难弄清楚它应该如何进行。我按照本教程创建下拉列表,效果很好。
提前致谢。
我会尽量简单地说明这一点,但基本上我想要实现的就是这个。
有两种具有一对一关系的页面类型,汽车和所有者。我希望能够通过汽车页面上的下拉菜单选择车主。如果车主已经链接到另一辆车,我不希望它出现在下拉列表中。
我知道我需要一个 if 语句,但我发现很难弄清楚它应该如何进行。我按照本教程创建下拉列表,效果很好。
提前致谢。
您可以修改为您提供下拉值的函数。您的DataObject::get()
调用可以对第二个参数进行过滤。只需选择 CarID 为 0 的所有所有者。
因此,从您提供的教程中,您可以使用此修改后的代码:
new DropdownField(
'OwnerID',
'Please choose an owner',
Dataobject::get("Owner","CarID='0'")->map("ID", "Title", "Please Select")
);
2点需要注意:
这假设您的 DataObjects 被调用Car
并且Owner
(根据需要进行更改,但将 ID 保留在名称的末尾,如上所述)
这可能不起作用,具体取决于您如何设置与$has_one
DataObjects 上的分配的关系。如果表格上没有CarID
字段Owner
,那么此代码将无济于事(反之亦然)。在这种情况下,您必须创建一个循环遍历所有汽车的函数,然后从该 DataObjectSet 中删除OwnerID
值为 0 的 DataObjects。如果这没有意义,请添加注释。
本杰明·史密斯的回答对于您要求的下拉列表完全有效,只是想指出另一种方法:与其自己处理一对一的关系,不如由“HasOneComplexTableField”为您处理。
为您的 Car 类使用以下代码:
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()”调用,告诉表格字段只允许您选择尚未在另一辆车上选择的所有者。
您将在 silverstripe 教程中找到更多信息:http: //doc.silverstripe.org/framework/en/tutorials/5-dataobject-relationship-management