1

我会尽量简单地说明这一点,但基本上我想要实现的就是这个。

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

我知道我需要一个 if 语句,但我发现很难弄清楚它应该如何进行。我按照本教程创建下拉列表,效果很好。

提前致谢。

4

2 回答 2

2

您可以修改为您提供下拉值的函数。您的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_oneDataObjects 上的分配的关系。如果表格上没有CarID字段Owner,那么此代码将无济于事(反之亦然)。在这种情况下,您必须创建一个循环遍历所有汽车的函数,然后从该 DataObjectSet 中删除OwnerID值为 0 的 DataObjects。如果这没有意义,请添加注释。

于 2012-08-07T19:14:37.590 回答
1

本杰明·史密斯的回答对于您要求的下拉列表完全有效,只是想指出另一种方法:与其自己处理一对一的关系,不如由“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

于 2012-08-07T19:37:04.353 回答