在 SilverStripe ModelAdmin 中搜索关系记录
Searching for relational record in SilverStripe ModelAdmin
我有两个 DataObject
名为 AosMember
和 Council
。
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 中 Council
的 ModelAdmin
时,我看到 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
我建议使用这些作为管理一对一关系的替代方法:
- https://github.com/briceburg/silverstripe-pickerfield
- https://github.com/burnbright/silverstripe-hasonefield
- http://addons.silverstripe.org/add-ons/simonwelsh/hasoneedit
尚未测试其中任何一个,但我认为第一个最适合您的情况。
将 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;
}
}
我有两个 DataObject
名为 AosMember
和 Council
。
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 中 Council
的 ModelAdmin
时,我看到 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
我建议使用这些作为管理一对一关系的替代方法:
- https://github.com/briceburg/silverstripe-pickerfield
- https://github.com/burnbright/silverstripe-hasonefield
- http://addons.silverstripe.org/add-ons/simonwelsh/hasoneedit
尚未测试其中任何一个,但我认为第一个最适合您的情况。
将 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;
}
}