SilverStripe CMS DropdownField如何实现按标题或产品代码搜索
实现方案
Silverstripe ORM提供的map()方法第二个参数仅支持传入字符串类型的字段名,不支持数组,因此你尝试的写法无法生效,可通过以下两种方案实现同时显示产品代码、标题且支持双字段检索的需求:
方案1:给Product模型新增自定义访问器(推荐)
这是最符合Silverstripe开发规范的实现方式:
- 先在
Product模型类中新增拼接字段的自定义方法:
// 写入Product.php模型类中 public function getCodeWithTitle() { return $this->Code . ' - ' . $this->Title; }
- 修改DropdownField调用代码,直接映射这个自定义字段即可:
DropdownField::create( 'ProductID', '产品', Product::get()->sort('Title', 'ASC')->map('ID', 'CodeWithTitle') )->setEmptyString('-- 请选择 --');
修改后DropdownField的选项会显示「产品代码 - 产品标题」的组合格式,默认检索功能会匹配整个显示文本,自然支持同时按产品代码、产品标题检索。
方案2:手动构造映射数组(无需修改模型)
如果不想改动Product模型代码,可以直接遍历查询结果手动生成选项数组:
// 手动拼接选项数组 $productOptions = []; foreach (Product::get()->sort('Title', 'ASC') as $product) { $productOptions[$product->ID] = $product->Code . ' - ' . $product->Title; } // 传入自定义数组生成DropdownField DropdownField::create( 'ProductID', '产品', $productOptions )->setEmptyString('-- 请选择 --');
内容的提问来源于stack exchange,提问作者kenlog
相关产品推荐
相关产品推荐

