1. finder列表显示多表数据
我们知道默认的在后台中一个表对应一个dbschema,一个dbschema对应一个finder列表,但是有时候我们需要在一个finder列出两个或两个以上的表的数据,那么默认的情况下则不满足需求。如果需要在一个finder列表中显示多个表的数据有以下两种方法
1)在finder列表中增加虚拟列
2)通过在model中重构count getList get_schema等方法重组finder列表的数据显示
在finder列表中增加虚拟列
在什么情况下选择使用增加虚拟列的方式来在finder列表中显示多表数据?\
1)在要显示的多个表中有一个是要主要显示的表,其他的表只是需要显示一两列即可
2)在需求中不需要对增加的虚拟列进行列表排序
那么怎么样增加虚拟列?
首先,先看下在ECOS后台finder中增加自定义列的方法http://www.ec-os.net/advance/desktop/dev.html#id7
增加自定义列中的services.xml中对应的model应该是finder列主要显示的表的model
获取其他表数据,返回给虚拟列返回数据的格式: http://www.ec-os.net/advance/desktop/dev.html#id19
重组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中重构以上几个方法即可
1.建立finder对应的model文件,model继承dbeav
2.在model中重构count方法
<?php
...
public function count($filter=null)
{
if($filter['status'])
{
$filter['approve_status'] = $filter['status'];
unset($filter['status']);
}
return kernel::single('search_object')->instance('item')->count($filter);
}
...
3.在model中重构getlist代替getList方法为finder提供数据
<?php
...
public function getList($cols='*', $filter=array(), $offset=0, $limit=200, $orderBy=null)
{
if($filter['status'])
{
$filter['approve_status'] = $filter['status'];
unset($filter['status']);
}
$data = kernel::single('search_object')->instance('item')
->page($offset, $limit)
->orderBy($orderBy)
->search($cols,$filter);
return $data['list'];
}
...
如果getlist方法的条件finder需要过滤,则还需要重构_filter方法
4.重构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;
...
注:参照案例
sysitem_mdl_item extends dbeav_model
另外:在ectools中的报表中也有对应的实例