我有两个DataObject
名为AosMember
和Council
。
Council
班级与$has_one
的关系AosMember
。
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中的ModelAdmin
Council
时,我会看到Member
的文字输入。会员数是+500,所以理想情况下我希望能够输入姓氏并获得某种类型的自动填充。
至少我想要一个下拉字段。但我无法找到如何获得的说明。
答案 0 :(得分:3)
将Member.ID
添加到可搜索字段列表中会使此字段成为自动完成下拉字段:
class Council extends DataObject {
// ...
private static $searchable_fields = array(
'Member.ID' => array(
'title' => 'Member',
'filter' => 'ExactMatchFilter'
)
);
}
要在字段中搜索的文本将是AosMember
对象的标题。如果AosMember
没有标题,那么我们可以通过getTitle
函数返回特定内容:
class AosMember extends DataObject {
// ...
public function getTitle() {
return $this->FirstName . ' ' . $this->LastName;
}
}
答案 1 :(得分:2)
您需要在$searchable_fields
静态和scaffoldSearchFields()
调用中为SS提供更多信息。这样的事情(我从我自己的一个项目中删除了这个,你可能需要稍微改变它以供你自己使用)
/**
* @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中看到DropdownField
&#39}。中心"过滤"窗格。注:您将需要一些进一步的逻辑来处理has_one
关系。上述示例按原样,仅适用于通过$db
定义的直接字段。
答案 2 :(得分:2)
我假设你让模特管理员来支持它应该用于管理的编辑器有一个关系。
这将是一个下拉字段,但如果有超过100条记录默认为输入字段以供内存使用,请参阅对已接受答案的评论:Silverstripe admin: "Has one" dropdown converts to ordinary input field after import
我建议使用这些作为管理has-one关系的替代方法:
没有测试过任何一个,但我认为第一个对你的情况最好。