统一分页列表

分页特点

  1. 注册回调函数 : 每当分页请求数据前后和初始化都会触发对应回调,以达到实时处理的要求,如:停止请求,对请求的结果进行处理
  2. 前后端数据共享 : 为达到最大的共享度,加入前后端自定义数据交换传递功能因前端有操作此功能的权限,不要将敏感数据作为共享数据传递,防止信息泄露或提权注入
  3. 灵活模板解析 : 根据不同的效果,可以自定义分页结构

配置参数 of_base_com_com::paging($config, $params = null)

前端操作 每个已初始化的分页会被绑定一个 paging(type, mode = null) 的函数

分页安全 为了保证系统安全,增加分页授权概念,通过判断用户或简单验证是否允许访问分页

配置 _of.com.com::paging.check 设置
字符串以@开头的字符串作为正则验证是否通过
系统回调符合系统回调规范,接收参数为"类名::方法名"格式

分页演示

控制层 /ctrl/test.php
/**
 * 控制层, 在入门演示的基础上增加两方法
 */
class class ctrl_test extends L {
    /**
     * 描述 : html模板开发
     * 作者 : Edgar.lee
     */
    public function viewPaging() {
        //生成默认分页模板
        $this->view->_pagingHtml = &$this->paging();
        //加载分页视图层
        $this->display('/paging.html');
    }

    /**
     * 描述 : 该方法更合适放在模型层, 这里重点演示
     *        通过 echo $this->paging() 输出分页
     *        $params 接收初始化与js共享参数
     *        默认方法名须以paging结尾, 受配置_of.com.com::paging.check影响
     */
    public function paging($params = array()) {
        $sql = 'SELECT
            id, type
        FROM
            t_questions_info';

        $config = array(
            'id'    => array(
                '_attr' => array(
                    'body' => '排序的id : {`id`}',
                    'sort' => 'id'
                )
            ),
            'name'  => '<font color=red>`{`type`}显示的数据</font> : {`type`}',
            '_attr' => array(
                'data'   => &$sql,
                'params' => &$params,
                'method' => __METHOD__
            )
        );
        return of_base_com_com::paging($config);
    }
}
return true;
视图层 /ctrl/paging.html
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <!--<?
    echo $this->_pagingHtml;
    ?>-->
</body>
</html>
访问 /?c=ctrl_test&a=viewPaging

高级分页

/**
 * 自定义 html 模版时使用, 以 name 作为元素的区分
 * 自定义 html 时需引用 OF_URL . "/att/com/com/paging/main.js"
 * pagingBlock 添加 style="visibility: hidden;" 样式会获得更好的初始加载效果
 */
模版元素 : {
    分页结构 : name="pagingBlock" method="请求方法" style="visibility: hidden;" items="总条数,空为自动查询" size="每页显示数" page="当前页数" params="json共享数据" event="事件回调脚本" save="保存状态"
    单条数据 : name="pagingItem" 使用{`字段名`}替换数据,"`"做为转义字符
    空无展示 : name="pagingEmpty"
    请求提示 : name="pagingWait"
    排序按钮 : name="pagingSort" sort="以','分隔的字段名"
    首页按钮 : name="pagingFirst" 
    上一按钮 : name="pagingPrev" 
    下一按钮 : name="pagingNext" 
    尾页按钮 : name="pagingLast" 
    数据总数 : name="pagingCount" 须拥有innerHTML属性
    当期位置 : name="pagingPage" 须拥有innerHTML属性
    跳转位置 : name="pagingJump" 如果拥有nth="第{`p+1`}页"属性,则点击跳转(其中p=当前页,m=最大页,无效的分页会被隐藏),否则可以使用input[type=text]回车跳转
    数据条数 : name="pagingSize" input[type=text]
    额外工具 : name="pagingFbar" 默认分页使用
}

命名空间 :
    当我们需要分页中嵌套另一个或多个分页时,可以使用命名空间来区分不同分页数据
    将 pagingBlock 块加前缀"命名:", 如: name="demo:pagingBlock" 这样便启用了命名空间
    接着这个分页下的其它name值前缀为"demo:"的均归作为这个分页的元素
    然后将{`字段名`}改为{`命名:字段名`}, 如: {`demo:test`} 就会接收这个分页数据
    没有修改或为其它命名的将作为其对应父类分页的元素或接收对应父类分页的数据

模版示例 :
<div name='pagingBlock' method='demo_index::paging'>
    <span name='pagingItem' id={`id`}>交替显示一{`value`}</span>
    <span name='pagingItem' id={`id`}>交替显示二{`value`}</span>
</div>


/** * 描述 : 全局 _attr.data 为数组时使用 */ 请求数据交互结构($_POST) : { 'method' : 请求方法 类名::方法名 'items' : 总数据条目数, ''=重新查询 'size' : 每页显示数 'page' : 当前页数 'sort' : 排序字段 'params' : 共享参数 'data' : 响应的二维数据 }

高级演示

控制层 /ctrl/test.php
/**
 * 控制层, 在入门演示的基础上增加两方法
 */
class class ctrl_test extends L {
    /**
     * 描述 : html模板开发
     * 作者 : Edgar.lee
     */
    public function viewPaging() {
        //初始化模板环境, 也可以同分页模板一同封装到一起, 实际仅加载了OF_URL . "/att/com/com/paging/main.js"
        $this->paging();
        //加载分页视图层
        $this->display('/paging.html');
    }

    /**
     * 描述 : 因为是自定义模板, 所以$config中不用写除_attr之外的键
     *        paging方法可以为静态方法
     */
    public function paging($params = array()) {
        $sql = 'SELECT
            id, type
        FROM
            t_questions_info';

        $config = array(
            '_attr' => array(
                'data'   => &$sql,
                'params' => &$params,
                'method' => __METHOD__
            )
        );
        return of_base_com_com::paging($config);
    }
}
return true;
视图层 /ctrl/paging.html
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <!--自定义的模板, 注意method属性的回调方法-->
    <div name='pagingBlock' method='ctrl_test::paging'>
        <span name='pagingItem' id={`id`}>交替显示一{`type`}</span>
        <span name='pagingItem' id={`id`}>交替显示二{`type`}</span>
    </div>
</body>
</html>
访问 /?c=ctrl_test&a=viewPaging