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

#1 冈刀飞絮

public function pager($page, $pageSize = 10, $scope = 10, $total){
                $this->page = null;
                if($total > $pageSize){
                        $total_page = ceil($total / $pageSize);
                        $page = min(intval(max($page, 1)), $total);
                        $this->page = array(
                                'total_count' => $total,
                                'page_size'   => $pageSize,
                                'total_page'  => $total_page,
                                'first_page'  => 1,
                                'prev_page'   => ( ( 1 == $page ) ? 1 : ($page - 1) ),
                                'next_page'   => ( ( $page == $total_page ) ? $total_page : ($page + 1)),
                                'last_page'   => $total_page,
                                'current_page'=> $page,
                                'all_pages'   => array(),
                                'offset'      => ($page - 1) * $pageSize,
                                'limit'       => $pageSize,
                        );
                        $scope = (int)$scope;
                        if($total_page <= $scope ){
                                $this->page['all_pages'] = range(1, $total_page);
                        }elseif( $page <= $scope/2) {
                                $this->page['all_pages'] = range(1, $scope);
                        }else{
                                $this->page['all_pages'] = range($page - $scope/2 , min( $page + $scope/2 -1,  $total_page));
                        }
                }
                return $this->page;
        }
捕获.PNG
半径前半大后半小。

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

 $page = isset($_GET["page"])? $_GET['page']:1 ;
                $my = new My();
                $oo = $my->findAll("","id desc","*", array($page,  20));
        $this->page = $my->page;
                $this->mydd = $oo;
                $this->display("test.html");
模板:

<{foreach $mydd as $v}>
       
               
               
       
<{/foreach}>

  
      
  

<{$v.id}><{$v.name}>

          总数量:<{$page.total_count}>
          总页数:<{$page.total_page}>
             页码
          <{foreach $page.all_pages as $p}>
            
            <{if $p== $page.current_page}>
                    <{$p}>
            <{else}>
                <{$p}>
            <{/if}>
            

          <{/foreach}>
      


2015-10-18 15:15:02

#2 jake

mark一下先。{:soso_e181:}

2015-10-18 20:16:15

#3 冈刀飞絮

$controller_name = $__controller.'Controller';
$httpMethod =strtolower($_SERVER['REQUEST_METHOD']) ;
$action_name = $httpMethod.ucfirst($__action);

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

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

2015-10-21 14:34:20

#4 jake

冈刀飞絮 发表于 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:23:58

#5 jake

对于协作开发,我的初步想法是建个Q群或微信群啥的,可以即时聊一些想法。

然后再通过github的合并之类的进行代码协作。

2015-10-21 15:26:27

#6 冈刀飞絮

1、restful 只是个幌子, 重点是在方便权限控制
   
edit  editSave 在权限表里面一般要添加两条记录才能控制,其实就是一个修改 有 修改页面的权限肯定就得有保存修改的权限。
而用 getEdit 和  postEdit方式 直接控制的路由路径只有一个 /edit (不知道我是否表达清楚,你是否看明白我的意思)

2、加判断开启这款代码这个我非常赞成

2015-10-21 17:48:55

#7 jake

冈刀飞絮 发表于 2015-10-21 17:48
1、restful 只是个幌子, 重点是在方便权限控制
   
edit  editSave 在权限表里面一般要添加两条记录才能控 ...
哈哈,Acl的做法也不一定是那样的。新版的做法权限控制放init里面,自己写就行。

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


2015-10-21 18:05:35

#8 冈刀飞絮

(当然我说的前提都是类似我说的普通权限管理做法) 对于数据库来说只是多了一条记录,但是对于业务操作权限管理的人员来说就非常迷茫,很纠结。这个东西几年前的项目,项目操作管理人员非常不舒服这一点。 本来勾选一个修改权限,还来一个修改保持。 不够修改保持修改页面能打开,但是保存按钮由于权限控制着不显示不能保持,所以这个很容易在 客户体验上带来弊端。
综上从实际业务 用户体验出发的话这样带来很大的好处。

2015-10-21 20:25:46

#9 冈刀飞絮

baseController 重写init(){} 里面做法,也只是说这段代码的逻辑写在这里头。类似一个其他框架的filter,但是如果控制某个系统的权限还得是数据库保存相关的权限,然后设置角色什么的管理来处理,实际思路还是一样,给业务上体现也是一样吧。

2015-10-21 20:32:09

#10 jake

冈刀飞絮 发表于 2015-10-21 20:25
(当然我说的前提都是类似我说的普通权限管理做法) 对于数据库来说只是多了一条记录,但是对于业务操作权 ...
其实你说的也是对的。

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

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

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

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

综上,我才会说其实对权限系统来说,多少条记录问题不大,像上面说的控制粒度到控制器,那么实际上数据库只有一条记录,甚至没有记录,因为这个控制是放init里面的。

2015-10-22 08:35:06