请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 2906|回复: 9

jake speed.php 分页按常规应该稍作修改?

[复制链接]
发表于 2015-10-18 15:15:02 | 显示全部楼层 |阅读模式
  1. public function pager($page, $pageSize = 10, $scope = 10, $total){
  2.                 $this->page = null;
  3.                 if($total > $pageSize){
  4.                         $total_page = ceil($total / $pageSize);
  5.                         $page = min(intval(max($page, 1)), $total);
  6.                         $this->page = array(
  7.                                 'total_count' => $total,
  8.                                 'page_size'   => $pageSize,
  9.                                 'total_page'  => $total_page,
  10.                                 'first_page'  => 1,
  11.                                 'prev_page'   => ( ( 1 == $page ) ? 1 : ($page - 1) ),
  12.                                 'next_page'   => ( ( $page == $total_page ) ? $total_page : ($page + 1)),
  13.                                 'last_page'   => $total_page,
  14.                                 'current_page'=> $page,
  15.                                 'all_pages'   => array(),
  16.                                 'offset'      => ($page - 1) * $pageSize,
  17.                                 'limit'       => $pageSize,
  18.                         );
  19.                         $scope = (int)$scope;
  20.                         if($total_page <= $scope ){
  21.                                 $this->page['all_pages'] = range(1, $total_page);
  22.                         }elseif( $page <= $scope/2) {
  23.                                 $this->page['all_pages'] = range(1, $scope);
  24.                         }else{
  25.                                 $this->page['all_pages'] = range($page - $scope/2 , min( $page + $scope/2 -1,  $total_page));
  26.                         }
  27.                 }
  28.                 return $this->page;
  29.         }
复制代码

半径前半大后半小。

再附加一个使用分页的列子:
Action:

  1. $page = isset($_GET["page"])? $_GET['page']:1 ;
  2.                 $my = new My();
  3.                 $oo = $my->findAll("","id desc","*", array($page,  20));
  4.         $this->page = $my->page;
  5.                 $this->mydd = $oo;
  6.                 $this->display("test.html");
复制代码
模板:
  1. <table>
  2. <{foreach $mydd as $v}>
  3.         <tr>
  4.                 <td><{$v.id}></td>
  5.                 <td><{$v.name}></td>
  6.         </tr>
  7. <{/foreach}>

  8.   <tr>
  9.       <td colspan="2">
  10.           总数量:<{$page.total_count}>
  11.           总页数:<{$page.total_page}>
  12.              页码
  13.           <{foreach $page.all_pages as $p}>
  14.             <a href="?page=<{$p}>">
  15.             <{if $p== $page.current_page}>
  16.                     <strong><{$p}> </strong>
  17.             <{else}>
  18.                 <{$p}>
  19.             <{/if}>
  20.             </a>
  21.           <{/foreach}>
  22.       </td>
  23.   </tr>

  24. </table>
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为新用户

x
发表于 2015-10-18 20:16:15 | 显示全部楼层
mark一下先。{:soso_e181:}
 楼主| 发表于 2015-10-21 14:34:20 | 显示全部楼层
  1. $controller_name = $__controller.'Controller';
  2. $httpMethod =strtolower($_SERVER['REQUEST_METHOD']) ;
  3. $action_name = $httpMethod.ucfirst($__action);

  4. if(!class_exists($controller_name, true)) err("Err: Controller '$controller_name' is not exists!");
  5. $controller_obj = new $controller_name();

  6. if(!method_exists($controller_obj, $action_name)){
  7.         $action_name = 'action'.$__action;
  8.         if(!method_exists($controller_obj, $action_name)) err("Err: Method '$action_name' of '$controller_name' is not exists!");
  9. };
复制代码
jake 这段做这样改动 目的:
1、支持 resultful 相关特性
2、最终要的是权限控制的时候方便了,平时我们控制权限的时候比如 修改 会有个 edit ,  editSave 都需要控制,
     而在业务上面这种事很lower的 ,想想客户打开edit页面他肯定是应该有editSave全新的吧。否则那只是个看无意义
     而上面这样一改 都是 edit  只需要控制一个 edit的全新 , edit 对于对应了 getEdit   edit 对于客户端post提交的 postEdit
另外 jake  github 我 request pull 是否有人维护,如果有人维护,以后我有想法改动的网github去提交,然后请你审核,如果好的合并到主干??

发表于 2015-10-21 15:23:58 | 显示全部楼层
冈刀飞絮 发表于 2015-10-21 14:34
jake 这段做这样改动 目的:
1、支持 resultful 相关特性
2、最终要的是权限控制的时候方便了,平时我们 ...

github我在维护,看到了你的提交。

在code的commit里面我有做了些评论,你提交的代码里面有加上调试的东西,这些不方便合并的。

这帖子里面说的页码,我还没来得及测试,最近比较忙。

这次pull request关键是restful的模式,当然,如果按你说的关于权限或者CRUD操作,实际上用restful是浪费了。一个Edit的get和post,实际上写到一个action里面,会更好看很多。

restful更多是跟风(人有我有),当然有一定的意义,目前用的最多是移动APP端。因为移动端访问HTTP如果有更直观的URL会更方便——这是restful支持者说的——如果没有优点那就没必要存在了。

不过,以上代码的改动,要看看是否“值得”,这里比较耗能的是多了一次method_exists,如果这个restful一直没人用,但这个method_exists也是一直会执行的。

一般这种类型的,仅是少量用户使用的不常用功能,很多框架会先做个外面的开关,这样在配置上可以打开,就不会耗能太多。

不过我个人的意见是,restful实际上是通过URLrewrite会更简单,而且只是对$_SERVER['REQUEST_METHOD']进行一个小的判断。所以即便没有修改这段代码,一般开发者也能通过$_SERVER['REQUEST_METHOD']的判断来完成restful系统的开发。

发表于 2015-10-21 15:26:27 | 显示全部楼层
对于协作开发,我的初步想法是建个Q群或微信群啥的,可以即时聊一些想法。

然后再通过github的合并之类的进行代码协作。
 楼主| 发表于 2015-10-21 17:48:55 | 显示全部楼层
1、restful 只是个幌子, 重点是在方便权限控制
   
edit  editSave 在权限表里面一般要添加两条记录才能控制,其实就是一个修改 有 修改页面的权限肯定就得有保存修改的权限。
而用 getEdit 和  postEdit方式 直接控制的路由路径只有一个 /edit (不知道我是否表达清楚,你是否看明白我的意思)

2、加判断开启这款代码这个我非常赞成
发表于 2015-10-21 18:05:35 | 显示全部楼层
冈刀飞絮 发表于 2015-10-21 17:48
1、restful 只是个幌子, 重点是在方便权限控制
   
edit  editSave 在权限表里面一般要添加两条记录才能控 ...

哈哈,Acl的做法也不一定是那样的。新版的做法权限控制放init里面,自己写就行。

另外,对于数据库记录来说,一条记录和两条,区别不大。


 楼主| 发表于 2015-10-21 20:25:46 | 显示全部楼层
(当然我说的前提都是类似我说的普通权限管理做法) 对于数据库来说只是多了一条记录,但是对于业务操作权限管理的人员来说就非常迷茫,很纠结。这个东西几年前的项目,项目操作管理人员非常不舒服这一点。 本来勾选一个修改权限,还来一个修改保持。 不够修改保持修改页面能打开,但是保存按钮由于权限控制着不显示不能保持,所以这个很容易在 客户体验上带来弊端。
综上从实际业务 用户体验出发的话这样带来很大的好处。
 楼主| 发表于 2015-10-21 20:32:09 | 显示全部楼层
baseController 重写init(){} 里面做法,也只是说这段代码的逻辑写在这里头。类似一个其他框架的filter,但是如果控制某个系统的权限还得是数据库保存相关的权限,然后设置角色什么的管理来处理,实际思路还是一样,给业务上体现也是一样吧。

发表于 2015-10-22 08:35:06 | 显示全部楼层
冈刀飞絮 发表于 2015-10-21 20:25
(当然我说的前提都是类似我说的普通权限管理做法) 对于数据库来说只是多了一条记录,但是对于业务操作权 ...

其实你说的也是对的。

我的意思并非Acl不好,而是说sp那个acl,原本是给比较简单的权限逻辑使用的。如果按单个控制器/动作进行控制的方式,其实挺累的。

实际上真正跑起来的权限系统,都会比这个更复杂。

真正做起来,都会在抽象层面再进行一次合并权限,比如说你说的表单+提交的action,会在设置权限的位置合并起来成为一个选项给操作人员使用。

不过大部分时候,我们会把整个CURD某个东西的控制器,当作一个权限来看,比如说“写文章”权限,这里隐含了是文章列表、写入、修改、删除等几个action了。

综上,我才会说其实对权限系统来说,多少条记录问题不大,像上面说的控制粒度到控制器,那么实际上数据库只有一条记录,甚至没有记录,因为这个控制是放init里面的。
您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2019-12-16 07:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表