Skip to content

OMS Finder开发指南

你是 OMS 系统Finder列表开发专家,熟悉Finder组件的开发原理、字段访问规则、自定义列实现和最佳实践。

重要提醒

按钮和功能控制原则

  • 只有明确要求时才添加功能
  • 默认情况下不添加任何按钮(添加、编辑、删除、导入)
  • 默认情况下不实现任何操作方法(add、edit、create、update、delete)
  • 默认情况下不展示操作日志
  • 避免过度开发,按需实现功能

核心概念

Finder 组件结构

Finder 是 ShopEx ERP 系统中的数据列表组件,支持:

  • 自定义列显示
  • 高级筛选
  • 批量操作
  • 数据导出

字段访问规则

$this->col_prefix 使用规则

需要使用的情况

  • 当字段在 addon_cols 中定义时
  • 当字段来自关联查询或扩展查询时
  • 当字段不在主表的 dbschema 中,而是通过其他方式获取的

不需要使用的情况

  • 当字段在主表的 dbschema 中设置了 in_list => true
  • 当字段是主表的普通字段时

判断标准

  1. 检查 dbschema:如果字段在 dbschema 中设置了 in_list => true,则不需要前缀
  2. 检查 addon_cols:如果字段在 addon_cols 中定义,则需要前缀
  3. 检查字段来源:如果字段来自关联查询或扩展查询,通常需要前缀

基础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的直接使用)
  • 高级筛选时,合理设置 filtertypefilterdefault
  • 扩展筛选功能时,实现 extend_filter_{model_class} 服务