201703:SuiteCRM自定义筛选界面
201703:SuiteCRM自定义筛选界面
SuiteCRM自定义筛选界面 (Popup)
- 筛选界面显示自定义
- 自定义筛选条件字段
- 关于列表排序
Popup视图关系图
1. 筛选界面显示自定义
定义文件结构
<?php
$popupMeta = array ('moduleMain' => 'HAC_Bank_Accounts','varName' => 'HAC_Bank_Accounts',//排序字段,可以扩展成多个字段'orderBy' => 'hac_bank_accounts.name','whereClauses' => array (//请求参数到数据库字段的映射
),//追加查询语句'whereStatement' => '''searchInputs' => array (//请求参数名
),'searchdefs' => array (//搜索字段定义
),'listviewdefs' => array (//结果列表字段定义
)
);
1.增加字段和自定义
在对应定义添加字段定义即可:
'CONTRACT_NAME' =>array (//字段类型'type' => 'relate','default' => true,//是否在工作室中显示'studio' => 'visible',//标签名,可自定义'label' => 'LBL_CONTRACT_NAME_1',//宽度'width' => '24%',//对应模块字段名,可省略'name' => 'contract_name'//附加参数'displayParams'=> array() //...),
对于列表定义注意需设置
'default' => true,
,否则不会显示列
2. Popup视图的调用
前端调用
open_popup(module_name, //模块名width, //窗口宽度height, //窗口高度initial_filter, //追加查询条件close_popup, //是否自动关闭,,默认truehide_clear_button, //是否隐藏清除按钮,默认truepopup_request_data, //请求报文,处理选择后的回调popup_mode, //POPUP模式(多选和单选),多选时,返回记录ID为键数组create, //默认false,是否可创建模块metadata //指定使用的popup定义文件名称
)
请求报文定义,可附加在编辑界面的字段定义中
popupRequestData = {"call_back_function" : "setFuncReturn",//回调函数"form_name" : "EditView",//返回值和页面元素映射"field_to_name_array" : {"id":"line_function_id","name":"line_function_name","func_icon":"line_func_icon",}}
3. Popup列表添加字段
包括在自定义列表表头和添加非本模块字段,修改表头通过添加label可以实现,添加字段包块以下两步:
其一、在popupdef的listviewdefs中添加字段定义
'CONTRACT_NUMBER' =>array('type' => 'varchar','label' => 'LBL_CONTRACT_NUMBER','width' => '10%','name' => 'contract_number','studio' => 'visible','default' => true,),
其二、对其进行赋值
重写模块的get_list_view_data方法:
function get_list_view_data() {global $app_list_strings,$db;//get_list_view_array与get_list_view_data相同$line_fields = $this->get_list_view_array();if(isset($_REQUEST['popuptype']) && $_REQUEST['popuptype'] == '<特定List>'){//获取当前$line_fields['<自定义字段(大写)>'] = <要附的值>;}}return $line_fields;}
后端控制
在后台PopupView中,通过设置请求参数中的metadata,sqlClause参数控制Popup视图的调用和控制条件
class <ModuleName>ViewPopup extends ViewPopup
{function Display() {if ($_REQUEST['<Params>']!= <Value>){$_REQUEST['metadata'] = '<Def文件名>';//可以附加其他参数}parent::Display();}
}
3. 自定义筛选条件字段
主要针对非本模块字段,对于本模块字段在searchdefs中添加即可
几点注意:
1. 对于非数据库字段,只要在verdefs中有定义,框架仍会当成本模块字段来拼接SQL语句,除非它为空,所以一般只在popupdef中定义字段
2. 关联字段创建必须有id属性,无论是在verdef还是popupdef中
3. 对于非本模块字段的查询条件需要手动处理,追加SQL条件,常用过的有EXISTS语句
4. 对于非本模块字段在查询结果界面不会保留上次查询条件,需要查询字段的回写,即在查询结果页面保留查询条件
1. 添加一般类型字段
第一步 在popupdef中添加字段定义,不需要添加到verdefs中
'contract_number' =>array('type' => 'varchar','label' => 'LBL_CONTRACT_NUMBER','width' => '10%','name' => 'contract_number',),
第二步 在PopupView中设置处理查询参数和字段回写
处理REQUEST参数,并在页面嵌入js代码实现查询条件回写
//字段名有advanced后缀
if(isset($_REQUEST['<字段名>']) && $_REQUEST['<字段名>'] != ''){//对字段参数进行预处理,保存到重命名字段中,并清空原字段$origin_value = $_REQUEST['<字段名>'];$_REQUEST['<重命名字段名>'] = $_REQUEST['<字段名>'];$_REQUEST['<字段名>'] = '';parent::Display();echo '<script>$("#<字段名>").val("'.origin_value .'");</script>';
}
第三步 追加查询条件
在popupdef中根据传入参数是否为空,拼接where条件并添加到whereStatement属性中
$condition = "";
if(isset($_REQUEST['<重命名字段名>']) && $_REQUEST['<重命名字段名>']!=""){$condition .= " EXISTS (<SQL语句>) ";
}
...
'whereStatement'=>....$condition,
2. 添加关联字段
对于查询字段是关联字段的需要在popupdef中定义关联字段和id字段,并且组合的查询条件相比于一般字段更加复杂
第一步 在popupdef中定义字段
'hit_racks_s' =>array ('name' => 'hit_racks_s','vname' => 'LBL_HIT_RACKS_S','type' => 'relate','default' => true,'id_name' => 'hit_racks_id_s','ext2' => 'HIT_Racks','module' => 'HIT_Racks','rname' => 'name','quicksearch' => 'enabled','studio' => 'visible','width' => '10%'),
'hit_racks_id_s' =>array ('name' => 'hit_racks_id_s','vname' => 'LBL_HIT_RACKS_ID_S','type' => 'id','len' => 36,'size' => '20',),
第二步和第三步与一般字段类似;
3. 添加布尔值字段
popupdef中定义:
'has_sub_location' =>array('type' => 'bool','label' => 'LBL_HAS_SUB_LOCATION','width' => '10%','default' => true,'name' => 'has_sub_location', ),
bool类型的查询条件在界面上以下拉列表呈现,且以“0”、“1”多为值,未选择时为空,不会加入查询条件
3. 关于列表排序
1. 默认排序
排序字段:在popupdef中通过“orderBy”定义
排序方式:
//默认排序方式 asc$desc = $this->getSessionVariable($varName, $sortBy."S");if (empty($desc)){$desc = $defaultOrder;}$defaultOrder = $desc ? 'desc' : 'asc';$orderByValue = $defaultOrder;//ListView的setQuery方法可设置order by
if(!$allowOrderByOveride) {$this->query_orderby = $orderBy;return;}$this->getOrderBy($varName, $orderBy);...//通过请求参数修改排序方式
http://....lvso=DESC&HAT_Assets2_HAT_ASSETS_ORDER_BY=asset_group
注:
对于列表中有非本模块字段的,框架并不会进行排序,可以去掉排序功能,或在PopupView中进行处理
//一种参考
<script>$(".list.view thead tr th:eq(<所在列>)").children().eq(1).hide();
$(".list.view thead tr th:eq(<所在列>)").children().eq(0).children().eq(0).attr("href","#");
</script>