分页特点
- 注册回调函数 : 每当分页请求数据前后和初始化都会触发对应回调,以达到实时处理的要求,如:停止请求,对请求的结果进行处理
- 前后端数据共享 : 为达到最大的共享度,加入前后端自定义数据交换传递功能因前端有操作此功能的权限,不要将敏感数据作为共享数据传递,防止信息泄露或提权注入
- 灵活模板解析 : 根据不同的效果,可以自定义分页结构
配置参数 of_base_com_com::paging($config, $params = null)
-
config 调用或生成分页
字符串调用已有的分页 结构"类名::方法名"对象分页配置文件
如果不存在 "_attr" 属性, 则当前数组按 "_attr" 数组处理 { 页头文本 : 默认=同 "_attr.body.html" 属性 { 子页头 : 同 页头文本 结构 "_attr" : 列属性, 默认=null { "attr" : 页头属性, 默认="" "body" : 列体信息, 默认="", 字符串=同 "html" 属性, 对象={ "attr" : 列体属性, 默认="", 使用{`命名空间:字段名`}显示字段内容,"_"开头的字段名不会被转成html编码, `{`转义`}, 如 : 'id="id_{`id`}"' "html" : 列体内容, 默认="", 使用{`命名空间:字段名`}显示字段内容,"_"开头的字段名不会被转成html编码, `{`转义`}, 如 : '{`value`}' } "html" : 页头内容, 默认="", 字符串=同 "0" 属性, 数组=[页头前html, 页头后html] "sort" : 排序字段, 默认=不排序, 可以用","分割排序多个 "row" : 纵向跨度, 默认=自动计算, table的rowspan功能 } } "_attr" : 全局属性 { "call" : 回调一次 "data" 当页数据, 符合统一回调结构, 默认=不回调, 接收参数({ "data" : &当页二维数据, "attr" : &当前分页属性 { "method" : 分页位置, "items" : 总数据量, "size" : 每页条数, "page" : 当前页数, "sort" : 排序字段, "params" : 共享参数数组 } }) "data" : 获取数据, 默认=[], 字符串=sql语句{`LIMIT`}可以自定义limt的位置, 数组=单页二维数据(参考 数据交互结构) "dbPool" : 数据库连接池, 默认=default "items" : 数据长度, 数字 = 总数据长度, sql = 以`c`字段做为长度, -1 = 不计算页数, 默认 = data是数组时为-1, sql时查询总长 "params" : 终端与服务的共享数据, 默认={}, 此处为防注入数据(即:"'" => "\'"), 操作时请注意这一点 "size" : 每页数据量, 默认=_of.com.com::paging.size || 10 以下存在页头时生效 "action" : 翻页动作html, 默认=系统内部生成, 具体参考高级分页->模版元素 "attr" : 分页属性, 默认="", 字符串=同 "table" 属性, 数组={ "table" : 整个分页属性 "btr" : 分页体 tr 属性 } "empty" : 空数据展示界面, 默认="", 字符串=同 "html" 属性, 数组={ "attr" : 界面属性, 默认="" "html" : 界面内容, 默认="" } "event" : 初始化和翻页前后调用的一段js代码, 默认=不调用, this=当期分页, type=回调类型(init, before, after) "fbar" : 自定义导航区html, 默认="" "method" : 通信时位置(__METHOD__), 必填 "page" : 初始页数, 默认1 "save" : 保存浏览状态, 默认=不保存, 字符串=区分不同环境的关键词(如 : 用户ID=区分不同用户) "space" : 命名空间, 默认="", 可以实现分页嵌套分页功能 } }
-
params config 为字符串时启用
{ 'params' : 传递给分页的参数, 默认=缺省值 'config' : 替换 原始配置 非顶级 "_attr" 属性, 默认=原始配置 }
前端操作 每个已初始化的分页会被绑定一个 paging(type, mode = null) 的函数
-
分页对象.data 分页原始数据
服务器响应的分页原始数据,未响应前为 undefined
-
分页对象.单条数据(name="pagingItem").data 单条原始数据
服务器响应的分页对应每条原始数据
-
L.paging() 初始化全部分页
默认会自动调用, 只在动态生成分页时需手动调用
-
分页对象.paging(type, mode = null) 分页功能操作
type功能区分
数字 : 跳转到指定页面, 1=第一页, -1=最后一页 +/-n : 以当期页向后/前移动页数, '+1'=下一页, '-1'=上一页 排序 : 排序指定字段, '字段名 ASC/DESC', 如: 'a ASC, b DESC'=正序a,倒序b 条数 : 指定每页展示数量. '数字', 如: '4'=每页显示4条 null : 返回分页参数{"method":分页方法,"items":总条目数,"size":每页条数,"page":当前页数,"sort":排序状态{字段名:ASC / DESC, ...}} 无值 : 返回共享参数 对象 : 修改共享参数始配置
mode当type为对象或mode为true时会重新计算分页数, 同时type为对象mode还有如下作用 true = 完全代替参数并刷新 false = 完全代替参数不刷新 null = 单层替换参数并刷新(默认)
-
L.data('paging.after[]' | 'paging.before[]' | 'paging.init[]', 回调方法(type = 回调类型)) 注册回调
L.data('paging.before[]', function(type) { alert(this); //指向回调分页 alert(type); //'before'更新分页前, 还有('init' = 初始化完成, 'after' = 更新分页后) return false; //阻止之后的回调及分页请求 });
分页安全 为了保证系统安全,增加分页授权概念,通过判断用户或简单验证是否允许访问分页
配置 _of.com.com::paging.check 设置字符串以@开头的字符串作为正则验证是否通过系统回调符合系统回调规范,接收参数为"类名::方法名"格式分页演示
控制层 /ctrl/test.php/** * 控制层, 在入门演示的基础上增加两方法 */ class class ctrl_test extends L {
视图层 /ctrl/paging.html/** * 描述 : 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;
<!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