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

表单页面的配置相对简单, 配置文件中只有JavaScript控件这一类元素。

 

以下面这张页面为例


1.png


对应的配置文件如下

 

<PageGroup id="bbq_gift" title="礼包码">
    <Page mode="form" title="生成礼包码">
        <Controls>
            <Control type="input" validation="required" name="name" title="礼包名称"></Control>
            <Control type="select" validation="required|int" name="platform" title="平台">
                <ListItem value="-1" title="不区分平台"></ListItem>
                <ListItem value="0" title="PC"></ListItem>
                <ListItem value="1" title="iOS"></ListItem>
                <ListItem value="2" title="Android"></ListItem>
            </Control>
            <Control type="input" validation="required|int" name="channel" title="渠道"></Control>
            <Control type="input" validation="required|int" name="obtainTimes" title="可领取次数"></Control>
            <Control type="datetime" validation="required" name="valid_time" title="有效期"></Control>
            <Control type="bbq_attach" name="attachments" title="奖励"  validation="bbq_validate_reward" ></Control>
            <Control type="bbq_bat" name="bat" validation="bbq_validate_bat" title="批次"></Control>
        </Controls>
        <listen class="bbq_gen_gift"></listen>
    </Page>
 
    <Page mode="view" title="操作结果">
        <Fields>
            <Field name="message" title="结果"></Field>
        </Fields>
        <listen class=""></listen>
    </Page>
</PageGroup>

 

PageGroup节点下面有两个Page子节点, 第一个Page节点代表上面图片中的表单页面。 而第二个Page节点代表这张表单页面提交后的结果页面, 如下图所示


2.png


这也就是为什么在配置文件中多此一举的使用PageGroup节点作为根节点,在我们之前的讲解的内容中,这个节点仿佛是多余的, 一个Page节点就足够了。

 

事实上,一个配置文件并非只是对应一个页面,而是可以对应多个页面,PageGroup表示的是一组页面,其下的每个Page节点才表示单个页面。

 

言归正传, 我们来讲解表单页面的配置方法。

 

Page节点的直接点Controls节点下面有一组Control节点,每个control节点表示一个控件, 上面的配置文件表示的页面有5种空间, input、select、 datetime、bbq_attach、bbq_bat,组合起来就生成了一张表单页面。

 

后面有个节点


<listen  class="bbq_gen_gift"></listen>

 

这个节点的作用在前面已经讲过, 是PHP服务器段的业务逻辑,在这里就是处理表单提交的数据用的。

 

loadGm2ClassFile("bbq_base.php");
 
class bbq_gen_gift extends bbq_base {
    public function submit() {
        $data = $_POST;
        $bat = $data["bat"];
 
        $codeList = array();
        foreach($bat as $item) {
            $count = $item["count"];
            $index = $item["index"];
            $status = $item["status"];
            if( $status == 0 ) {
                $batCodes = array_keys( $this->owner->genBBQCdkey( $count ) );
            } else {
                $batCodes = array($count);
            }
            $codeList[] = array("index" => $index, "codes" => $batCodes, "sync" => false, "status" => $status );
        }
        unset($data["bat"]);
        $data["code_list"] = $codeList;
        $data["type"] = $this->getMaxType() + 1;
        //$data["status"]["sync"] = false;
        $mongo = $this->env->getSysMongoDB();
        $mongo->bbq_gift->save( $data );
        $this->saveHistory( json_encode( array("cmd"=>999998) ), array("retCode" => 0, "retmsg" => "ok") );
        return array( "error" => 0, "data" => array( "message" => "操作成功" ) );
    }
 
    private function getMaxType() {
        $db = $this->env->getBBQDataBase();
        $sql = "select max(`type`) as val from gift_serial";
        $result = $db->query($sql)->row_array();
        $type = $result["val"];
        return empty( $type ) ? 0 : $type;
    }
}

 

以上是这个文件的代码。和提取列表数据的文件不一样,这个文件需要实现一个submit方法,而不是getList方法。 在submit方法中, 可以些任意的PHP代码,但是方法的返回结果规定,必须符合某种下面这样的格式


array( "error" => 0, "data" => array( "message" => "操作成功" ) );

 

这个返会的数据, 正式用来渲染上没配置文件中第二个Page节点的配置的

 

    <Page mode="view" title="操作结果">
        <Fields>
            <Field name="message" title="结果"></Field>
        </Fields>
        <listen class=""></listen>
    </Page>
 


渲染的结果就是下面的这个页面。


3.png


http://gm.om.dianhun.cn/index.php?/gm2/index?action_id=bbq_gift&action_mode=form


这是页面的访问连接,其中 action_id 的值表示配置文件的名称, action_mode的值就是PageGroup下面第一个Page节点的mode属性。 


http://192.168.110.233/samba/chh/gm/index.php?/gm2/index?action_id=bbq_gift&action_mode=view


这个是提交结果页面的连接,就是

    <Page mode="view" title="操作结果">
        <Fields>
            <Field name="message" title="结果"></Field>
        </Fields>
        <listen class=""></listen>
    </Page>


配置项的对应

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

留言(0条)

我要发表留言

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

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

首页    GitHub 知乎 豆瓣 博客园