finder列表显示多表数据

我们知道默认的在后台中一个表对应一个dbschema,一个dbschema对应一个finder列表,但是有时候我们需要在一个finder列出两个或两个以上的表的数据,那么默认的情况下则不满足需求。如果需要在一个finder列表中显示多个表的数据有一下两种方法

1)在finder列表中增加虚拟列
2)通过在model中重构count getList get_schema等方法重组finder列表的数据显示

在finder列表中增加虚拟列

在什么情况下选择使用增加虚拟列的方式来在finder列表中显示多表数据?

1)在要显示的多个表中有一个是要主要显示的表,其他的表只是需要显示一两列即可
2)在需求中不需要对增加的虚拟列进行列表排序
那么怎么样增加虚拟列?

重组finder列表数据返回

当增加虚拟列麻烦或不能虚拟列不能满足需求的时候则需要使用重组finder列表数据返回给finder的方法进行finder列表显示多表数据

首先来看下finder列表是怎么获取数据显示的?

这里只是为了说明finder数据的显示,做了简化。
在默认的finder列表显示数据中,
    1)finder显示的数据统计(共N条)是由对应的model中的count方法获取。
    2)finder显示的数据是由对应model中的getlist方法获取。
    3)finder列表title是根据对应model通过get_schema放来获取对应的dbschema的结构
那么如果要使得finder列表能显示多表数据则需要在finder对用的model中重构以上几个方法即可

  • 建立finder对应的model文件,model继承dbeav
  • 在model中重构count方法
    <?php
    ...
    public function 
    count($filter=null){
        
    //自己写sql,返回满足条件的条数
        
    $sql 'SELECT count(*) as _count FROM (SELECT I.goods_id FROM '.
            
    kernel::database()->prefix.'b2c_orders as O LEFT JOIN '.
            
    kernel::database()->prefix.'b2c_order_items as I ON O.order_id=I.order_id LEFT JOIN '.
            
    kernel::database()->prefix.'b2c_goods as G ON G.goods_id=I.goods_id WHERE '.
            
    'O.disabled=\'false\' and O.pay_status!=\'0\' and '.$this->_filter($filter).' Group By I.goods_id) as tb';
        
    $row $this->db->select($sql);
        return 
    intval($row[0]['_count']);
    }
    ...
  • 在model中重构getlist代替getList方法为finder提供数据
    <?php
    ...
    public function 
    getlist($cols='*'$filter=array(), $offset=0$limit=-1$orderType=null){
        
    $sql 'SELECT I.goods_id as rownum,G.name as pname,G.bn as bn,sum(I.nums) as saleTimes,sum(I.amount) as salePrice,I.goods_id FROM '.
            
    kernel::database()->prefix.'b2c_orders as O LEFT JOIN '.
            
    kernel::database()->prefix.'b2c_order_items as I ON O.order_id=I.order_id LEFT JOIN '.
            
    kernel::database()->prefix.'b2c_goods as G ON G.goods_id=I.goods_id WHERE '.
            
    'O.disabled=\'false\' and O.pay_status!=\'0\' and G.goods_id!=\'0\' and '.$this->_filter($filter).' Group By I.goods_id';

        if(
    $orderType)$sql.=' ORDER BY '.(is_array($orderType)?implode($orderType,' '):$orderType);

        
    $rows $this->db->selectLimit($sql,$limit,$offset);
        return 
    $rows
    }
    ...

    如果getlist方法的条件finder需要过滤,则还需要重构_filter方法

  • 重构get_schema返回值本来get_schema方法会默认的去调用对应dbschema的数据,因为我们这个model没有对应的model那么,则需要重构对应的返回值给finder使用
    <?php
    ...
    public function 
    get_schema(){
        
    $schema = array (
            
    'columns' => array (
                
    //写法属性和dbschema差不多,对应的字段名是和上面的getlist中获取的字段一致的
                
    'rownum' => array (
                    
    'type' => 'number',
                    
    'default' => 0,
                    
    'label' => app::get('b2c')->_('排名'),
                    
    'width' => 110,
                    
    'orderby' => false,
                    
    'editable' => false,
                    
    'hidden' => true,
                    
    'in_list' => true,
                    
    'default_in_list' => true,
                    
    'realtype' => 'mediumint(8) unsigned',
                ),
                
    'pname' => array (
                    
    'type' => 'varchar(200)',
                    
    'pkey' => true,
                    
    'sdfpath' => 'pam_account/account_id',
                    
    'label' => app::get('b2c')->_('商品名称'),
                    
    'width' => 210,
                    
    'searchtype' => 'has',
                    
    'editable' => false,
                    
    'in_list' => true,
                    
    'default_in_list' => true,
                    
    'realtype' => 'mediumint(8) unsigned',
                ),
                ...
            ),
        );
        return 
    $schema;
    ...
注:参照案例
    class  b2c_ctl_admin_analysis extends desktop_controller

    class b2c_mdl_analysis_productsale extends dbeav_model

另外:在ectools中的报表中也有对应的实例

沪ICP备05002918号

© 2003-2017 ShopEx,Inc.All rights reserved.