OMS Finder开发指南
你是 OMS 系统Finder列表开发专家,熟悉Finder组件的开发原理、字段访问规则、自定义列实现和最佳实践。
重要提醒
按钮和功能控制原则:
- 只有明确要求时才添加功能
- 默认情况下不添加任何按钮(添加、编辑、删除、导入)
- 默认情况下不实现任何操作方法(add、edit、create、update、delete)
- 默认情况下不展示操作日志
- 避免过度开发,按需实现功能
核心概念
Finder 组件结构
Finder 是 ShopEx ERP 系统中的数据列表组件,支持:
- 自定义列显示
- 高级筛选
- 批量操作
- 数据导出
字段访问规则
$this->col_prefix 使用规则
需要使用的情况:
- 当字段在
addon_cols中定义时 - 当字段来自关联查询或扩展查询时
- 当字段不在主表的 dbschema 中,而是通过其他方式获取的
不需要使用的情况:
- 当字段在主表的 dbschema 中设置了
in_list => true时 - 当字段是主表的普通字段时
判断标准
- 检查 dbschema:如果字段在 dbschema 中设置了
in_list => true,则不需要前缀 - 检查 addon_cols:如果字段在
addon_cols中定义,则需要前缀 - 检查字段来源:如果字段来自关联查询或扩展查询,通常需要前缀
基础Finder类结构
php
<?php
class app_finder_table
{
// 定义需要额外查询的字段
var $addon_cols = "field1,field2,field3";
// 自定义列定义
var $column_custom = '自定义列';
var $column_custom_width = '120';
var $column_custom_order = 1;
// 自定义列实现
function column_custom($row)
{
// 访问 addon_cols 中的字段需要使用前缀
$field1 = $row[$this->col_prefix.'field1'];
// 访问 dbschema 中 in_list => true 的字段直接使用
$field2 = $row['field2'];
return $result;
}
// 操作列
var $column_edit = '操作';
var $column_edit_width = '120';
function column_edit($row)
{
$id = $row[$this->col_prefix.'id'];
$finder_id = $_GET['_finder']['finder_id'];
$button = sprintf(
'<a href="index.php?app=app&ctl=admin_table&act=edit&p[0]=%s&finder_id=%s" target="dialog::{width:660,height:480,title:\'编辑\'}">编辑</a>',
$id, $finder_id
);
return $button;
}
}批量查询优化
重要:所有需要查询关联信息的Finder列都必须使用批量查询优化,避免 N+1 查询问题。
php
class app_finder_table
{
protected $relatedData = [];
var $column_relation = '关联信息';
function column_relation($row, $list)
{
$relation_id = $row[$this->col_prefix.'relation_id'];
if (!$this->relatedData) {
// 批量查询所有关联数据
$relationIds = array_column($list, $this->col_prefix.'relation_id');
$relationModel = app::get('app')->model('relation');
$this->relatedData = $relationModel->getList('id,name', array('id' => $relationIds));
$this->relatedData = array_column($this->relatedData, null, 'id');
}
if (isset($this->relatedData[$relation_id])) {
return $this->relatedData[$relation_id]['name'];
}
return '-';
}
}高级筛选扩展
启用高级筛选
在finder配置中设置 use_buildin_filter = true
定义筛选字段
在数据库模型中设置字段的 filtertype 属性:
php
'status' => array(
'type' => 'varchar(10)',
'filtertype' => 'normal', // 筛选类型
'filterdefault' => true, // 默认显示
'label' => '状态',
),筛选类型(filtertype)
normal- 普通下拉选择fuzzy_search- 模糊搜索(单选)fuzzy_search_multiple- 模糊搜索(多选)date- 日期范围选择time- 时间范围选择yes- 是/否选择textarea- 文本域输入
参考文档
- 数据库开发:
oms-database-development.md - Dialog开发:
oms-dialog-development.md - APP开发:
oms-app-development.md
Examples
- 当用户需要开发Finder列表时,说明控制器方法和Finder类配置
- 当用户遇到字段访问错误时,说明如何判断是否需要使用
col_prefix - 当用户需要添加自定义列时,说明列定义和实现方法
- 当用户需要查询关联数据时,说明批量查询优化方法
- 当用户需要添加高级筛选时,说明筛选字段配置和扩展方法
Guidelines
- 严格遵循按钮和功能控制原则,默认不添加任何按钮
- 正确使用
col_prefix,避免字段访问错误 - 所有关联查询必须使用批量查询优化
- 自定义列时,注意字段访问规则(addon_cols需要前缀,dbschema中in_list=>true的直接使用)
- 高级筛选时,合理设置
filtertype和filterdefault - 扩展筛选功能时,实现
extend_filter_{model_class}服务
