Silverstripe GridField搜索结果仅显示Title,如何添加Name字段?
问题:搜索关联人员时仅显示Title字段,如何同时展示Name字段?
现有代码结构
TheTeam类
class TheTeam extends BaseElement { private static $table_name = 'theTeam'; private static $inline_editable = false; private static $belongs_many_many = [ 'People' => Person::class, ]; // 其他代码... }
Person类
class Person extends DataObject { private static $table_name = 'Person'; // 其他代码... private static $db = [ 'Sort' => 'Int', 'Title' => 'Text', 'Name' => 'Varchar(255)', 'Role' => 'Text', 'About' => 'Text', 'Phone' => 'Text', 'Email' => 'Text' ]; private static $many_many = [ 'Teams' => Team::class, 'Departments' => Department::class, 'TheTeams' => TheTeam::class, ]; private static $summary_fields = [ 'Name' => 'Name', 'Created.Nice' => 'Created' ]; private static $searchable_fields = [ 'Name', 'Role', 'Teams.ID' => ['field' => DropdownField::class, 'title' => 'Teams', 'filter' => ExactMatchFilter::class], 'Departments.Title' ]; // 其他代码... }
解决方案
SilverStripe的关联搜索组件(如GridFieldAddExistingAutocompleter)默认会使用模型的Title字段或getTitle()方法的返回值作为搜索结果的显示文本,你可以通过以下两种方式修改:
方法1:重写Person类的getTitle()方法
直接让getTitle()返回Name字段(或组合Name与其他字段),覆盖默认的Title显示逻辑:
class Person extends DataObject { // 现有代码... public function getTitle() { // 仅显示Name return $this->Name; // 若需同时显示Name和Title,可改为: // return sprintf('%s (%s)', $this->Name, $this->Title); } }
方法2:修改TheTeam类的关联配置
在belongs_many_many的关联定义中,通过title_field参数指定显示字段为Name:
class TheTeam extends BaseElement { // 现有代码... private static $belongs_many_many = [ 'People' => [ 'class_name' => Person::class, 'title_field' => 'Name' ], ]; }
两种方法都能实现搜索结果显示Name字段,你可以根据需求选择:方法1会全局改变Person模型的标题显示逻辑,方法2仅针对TheTeam与Person的关联生效。
内容的提问来源于stack exchange,提问作者Ela Buwa
相关产品推荐
相关产品推荐

