在 SilverStripe ModelAdmin 中搜索关系记录

Searching for relational record in SilverStripe ModelAdmin

我有两个 DataObject 名为 AosMemberCouncil

Council class 与 AosMember.

$has_one 关系
class Council extends DataObject {

    public static $db = array(
        'Title' => 'Varchar(255)',
        'Year' => 'Year(4)'
    );

    public static $has_one = array(
        'Member' => 'AosMember'
    );

    public static $summary_fields = array(
        'Year',
        'Title'
    );

    private static $searchable_fields = array(
        'Member.LAST_NAME' => 'PartialMatchFilter'
    );
}

当我进入 CMS 中 CouncilModelAdmin 时,我看到 Member 的文本输入。成员数是 +500,所以理想情况下我希望能够输入姓氏并获得某种自动完成功能。

至少我想要一个下拉字段。但是我找不到关于如何获取的说明。

您需要在 $searchable_fields 静态文件中向 SS 提供更多信息并致电 scaffoldSearchFields()。像这样的东西(我从我自己的一个项目中删除了它,你可能需要稍微改变它以供你自己使用)

/**
 * @var array
 */
private static $searchable_fields = array(
    'MyField' => array(
        'title'     => 'Title',
        'field'     => 'DropdownField',
        'filter'    => 'PartialMatchFilter'
    )
);

然后您需要指导 SS 如何构建您的可搜索会员字段:

    public function scaffoldSearchFields($_params = null) {
        $fields = parent::scaffoldSearchFields();
        $field = DropdownField::create('MyField','My field search', Member::get()->map()->toArray());
        $fields->replaceField('MyField', $field);

        return $fields;
    }

运行后,您应该会在 CMS 的中心 "filter" 窗格中看到一个 DropdownField。 N.b。您可能需要一些进一步的逻辑来处理 has_one 关系。上面的示例按原样仅适用于通过 $db.

定义的直接字段

我假设您正在让模型管理员搭建它应该使用哪个编辑器来管理 has one 关系。

这将是一个下拉字段,但如果超过 100 条记录,出于内存使用目的,将默认为输入字段,请参阅对已接受答案的评论:Silverstripe admin: "Has one" dropdown converts to ordinary input field after import

我建议使用这些作为管理一对一关系的替代方法:

尚未测试其中任何一个,但我认为第一个最适合您的情况。

Member.ID 添加到可搜索字段列表将使该字段成为自动完成下拉字段:

class Council extends DataObject {
    // ...

    private static $searchable_fields = array(
        'Member.ID' => array(
            'title' => 'Member',
            'filter' => 'ExactMatchFilter'
        )
    );
}

要在字段中搜索的文本将是 AosMember object 的标题。如果 AosMember 没有标题,那么我们可以通过 getTitle 函数 return 特定内容:

class AosMember extends DataObject {
    // ...

    public function getTitle() {
        return $this->FirstName . ' ' . $this->LastName;
    }
}