带你撸出一手好代码
第七节,xml配置文件的编写 - 列表页面的配置

XML配置是fast dev框架的核心, 框架程序的运行机制就是读取XML配置,经过一系列步骤后, 将配置转换成对用户友好的html页面。

 

Fast dev框架支持三种页面类型, 分别是列表页面、表达页面、数据展示页面, 这在文档的第一节已有过描述,在这里就不多赘述了。

 

这一节我们先讲述列表页面的配置方法


1.jpg


如上图, 分别是列表页面中的功能去于配置文件的对应关系。

 

<?xml version="1.0" encoding="UTF-8"?>
 
<PageGroup id="bbq_log_char" title="角色信息查询">
    <Page mode="list" title="角色信息查询">
        <SearchControls export="true">
            <SearchControl type="input" name="char_id" title="玩家ID"></SearchControl>
            <SearchControl type="input" name="account_id" title="账号ID"></SearchControl>
            <SearchControl type="input" name="iuin" title="角色ID"></SearchControl>
            <SearchControl type="" name="" title=""></SearchControl>
        </SearchControls>
        <Fields>
            <Field name="zid" title="大区ID"></Field>
            <Field name="logout_time" title="最后一次登录时间"></Field>
            <Field name="account_type" title="账号类型"></Field>
            <Field name="account_id" title="账号id"></Field>
            <Field name="user_id" title="玩家id"></Field>
            <Field name="iuin" title="角色id"></Field>
            <Field name="reg_time" title="注册时间"></Field>
            <Field name="reg_version" title="注册时版本"></Field>
            <Field name="reg_ip" title="注册时IP"></Field>
        </Fields>
        <listen  class="bbq_log_char"></listen>
    </Page>
</PageGroup>

 

这是一个列表页面的完整配置文件。

 

 

其中

 

 <SearchControls export="true">
            <SearchControl type="input" name="char_id" title="玩家ID"></SearchControl>
            <SearchControl type="input" name="account_id" title="账号ID"></SearchControl>
            <SearchControl type="input" name="iuin" title="角色ID"></SearchControl>
            <SearchControl type="" name="" title=""></SearchControl>
        </SearchControls>

 

这部分代表页面的搜索区块内容的配置。在这个列表页面中, 有三个搜索项, 分别是玩家ID、账号ID、角色,对应的可是页面如下图。


2.png


至于最后一项为什么要留空? 因为从页面的格式考录,一行可以放置四个搜索项,由于这个页面只需要三项, 所以第四个位置为空, 但是, 配置文件中的配置项不能留空,必须要放置一个type和title属性分别为空的配置项占位。

 

SearchControl元素有两个属性title和type, 其中type字段中的值表示的就是一个JavaScript控件,fast dev框架中的空间不但可以用在表单页面,也可以用在列表页面的搜索功能上。关于JavaScript空间的详细机制,可以参考第六节。

 

 

<Fields>
<Field name="zid" title="大区ID"></Field>
<Field name="logout_time" title="最后一次登录时间"></Field>
<Field name="account_type" title="账号类型"></Field>
<Field name="account_id" title="账号id"></Field>
<Field name="user_id" title="玩家id"></Field>
<Field name="iuin" title="角色id"></Field>
<Field name="reg_time" title="注册时间"></Field>
<Field name="reg_version" title="注册时版本"></Field>
<Field name="reg_ip" title="注册时IP"></Field>
</Fields>

 

这一部分是列表数据对应的配置项。 以下面的数据为例

 

array(
    array(
        "zid" => "1",
        "logout_time"=>"2017-11-11",
        "account_type"=>"1",
        "account_id"=>"10086",
        "user_id"=>"10086",
        "iuin"=>"123456",
        "reg_time"=>"2017-11-11",
        "reg_version"=>"1",
        "reg_ip"=>"192.168.1.1"
    ),
    array(
        "zid" => "1",
        "logout_time"=>"2017-11-11",
        "account_type"=>"1",
        "account_id"=>"10086",
        "user_id"=>"10086",
        "iuin"=>"123456",
        "reg_time"=>"2017-11-11",
        "reg_version"=>"1",
        "reg_ip"=>"192.168.1.1"
    ),
    array(
        "zid" => "1",
        "logout_time"=>"2017-11-11",
        "account_type"=>"1",
        "account_id"=>"10086",
        "user_id"=>"10086",
        "iuin"=>"123456",
        "reg_time"=>"2017-11-11",
        "reg_version"=>"1",
        "reg_ip"=>"192.168.1.1"
    )
)

 

框架便会根据配置文件将这部分数据转换为有3条记录列表。

 

 

配置文件的根元素 PageGroup有两个属性title和id

1、title属性用于作为页面功能的描述,没有其它对页面有实际影响的作用。

2、id属性必须于配置文件的文件名称一致。

 

PageGroup元素的子元素Page也有两个属性title和mode

1、其中title表示页面的名称, 对应的是生成的html文档title元素的值, 当然, 这个值也会在页面的其它用来说明页面的地方显示。

2、mode的值有重要的作用,我们将由浅至深的进行讲解, 在这一小节, 我们先简单的介绍一下作用。

 

gm.om.dianhun.cn/index.php?/gm2/index?action_id=bbq_log_char&action_mode=list


以这个连接为例, URL中有两个参数action_id和action_mode, 这两个参数对应的分别就是上面介绍的两个属性 PageGroup的id属性和Page的mode属性,框架程序通过action_id参数定位到配置文件, 通过mode参数定位到配置文件中page元素下面具体的配置内容, 之后才进行对配置文件的解析。


 

配置文件Page元素的最下面有一个listen节点

 

<listen class="bbq_log_char"></listen>

 

前面介绍过,这个节点表示页面对应的php业务逻辑处理文文件,在这个示例中对应的就是 bbq_log_char.php。

 

我们来看下这个文件的代码

 

loadGm2ClassFile("bbq_base.php");
 
class bbq_log_char extends bbq_base {
 
    protectd function getSqlsForListPage() {
        $charId = trim( @$_GET["char_id"] );
        $accountId = trim( @$_GET["account_id"] );
        $iuin = trim( @$_GET["iuin"] );
        $where = " 1=1 ";
        if(strlen($charId) == 0 && strlen($accountId) == 0 && strlen($iuin) == 0) {
            return array();
        }
        if(strlen($charId) > 0 ) {
            $where .= " and user_id = '{$charId}' ";
        }
        if(strlen($accountId) > 0 ) {
            $where .= " and account_id = '{$accountId}' ";
        }
        if(strlen($iuin) > 0 ) {
            $where .= " and iuin = '{$iuin}' ";
        }
        $countSql = "select count(1) as count from tab_create_char where {$where}";
        $listSql = "select *,
                              (case account_type when 1 then '游客' when 2 then '电魂' else account_type end ) as account_type,
                              (select max( record_time ) from tab_login where user_id = a.user_id) as logout_time
                            from tab_create_char as a
                            where {$where} order by record_time desc limit " . getLimit();
        $exportSql = "select *,
                            (case account_type when 1 then '游客' when 2 then '电魂' else account_type end ) as account_type,
                            (select max( record_time ) from tab_login where user_id = a.user_id) as logout_time
                            from tab_create_char as a
                            where {$where} order by record_time desc";
        return array("count_sql"=> $countSql, "list_sql" => $listSql,"export_sql" => $exportSql);
    }
 
    public function getList() {
        $db = $this->env->getBBQLogSrc();
        $sqls = $this->getSqlsForListPage();
        if(empty($sqls)){
            return array( 'data_count' => 0, 'data_list' => array());
        }
        $countSql = $sqls["count_sql"];
        $listSql = $sqls["list_sql"];
        $count = $db->query($countSql)->row_array()["count"];
        $list = $db->query($listSql)->result_array();
        return array( 'data_count' => $count, 'data_list' => $list);
    }
}


文件中有一个类, 类的名称与文件的名称要一致。如你所见,这个类只要 实现一个方法getList, 该方法返回一个关联数组,数组中有两个值, 分别是data_count和data_list,其中data_count表示列表页面的总记录数,data_list表示当分页的数据, 这两项数据和配置文件中Fields元素下的配置项是列表页面得以展示的基础。

 

至于类中的getSqlsForListPage,并非是必要的, 我们也可以把sql的拼接直接写在getList方法中。 假如你要将页面的数据导出成为excel文件,那个这个方法是必须要实现的,关于这以点, 我们将通过专门的篇幅来讲解, 在这里暂且搁置。

作者:陈大侠
日期:2017-10-11

留言(0条)

我要发表留言

您的大名 选填
电子邮箱 选填

欢迎关注微信公众号 「带你撸出一手好代码」

首页    GitHub 知乎 豆瓣 博客园