Zf 分页类 之 曲高和寡
时间:2008-08-01
来源:互联网
PHP代码:
<?php
//Model 直接继承这里就行
class Custom_Db_Table extends Zend_Db_Table
{
function preDispatch()
{
}
public function fetchPage($where = null, $order = null, $pagesize = 20, $currentpage = 1)
{
$result = array();
$result['count'] = $this->fetchAll($where, $order)->count();
$result['pagecount'] = $result['count']/$pagesize>1 ? ceil($result['count']/$pagesize) : 1;
$offset = ($currentpage-1)*$pagesize;
$result['currentpage'] = $currentpage;
$result['firstpage'] = 1;
$result['lastpage'] = $result['pagecount'];
$result['table'] = $this->fetchAll($where, $order, $pagesize, $offset)->toArray();
return $result;
}
}
?>
PHP代码:
<?php
//这个是可以直接写SQL的
require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
class Custom_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql
{
public function fatchPage($sql, $pagesize=20, $currentpage=1)
{
$currentpage = is_numeric($currentpage) ? $currentpage : 1 ;
$result = array();
$result_array = $this->query($sql);
$result['count'] = count($result_array->fetchAll());
$result['pagecount'] = $result['count']/$pagesize>1 ? ceil($result['count']/$pagesize) : 1;
$offset = ($currentpage-1)*$pagesize;
$result['currentpage'] = $currentpage;
$result['firstpage'] = 1;
$result['lastpage'] = $result['pagecount'];
$sql .= ' '.$this->select()->limit($pagesize, $offset)->__toString();
$result['table'] = $this->query($sql)->fetchAll();
return $result;
}
}
?>
PHP代码:
<?php
/*
* 类名:Custom_Page
* 功能:翻页处理类
* 版本:1.0
* 日期:20080731
* 作者:王哲
* 版权:NIO
*/
class Custom_Page
{
public static function mToPage(array $Page)
{
//firstpage
//count
//pagecount
//lastpage
//table
//currentpage
$url = 'http://'.$_SERVER ['HTTP_HOST'].$_SERVER["REQUEST_URI"];
$result = '共'.$Page['count'].'条记录 共'.$Page['pagecount'].'页 第'.$Page['currentpage'].'页';
$result .= '<select id="selectPage">';
for($i=1; $i<=$Page['pagecount']; $i++)
{
if (preg_match ("/page[\=|\/]{1}(\d+)/i", $url))
{
if(preg_match ("/page[\=]{1}(\d+)/i", $url))
{
$pageurl = preg_replace("/page[\=]{1}(\d+)/i", 'page='.$i, $url);
}
elseif (preg_match ("/page[\/]{1}(\d+)/i", $url))
{
$pageurl = preg_replace("/page[\/]{1}(\d+)/i", 'page/'.$i, $url);
}
}
else
{
$pageurl = '?page='.$i;
}
$selected = $Page['currentpage']==$i ? 'selected' : '';
$result.='<option value="'.$pageurl.'" '.$selected.'>'.$i.'</option>';
}
$result .= '</select>';
return array('showpage' => $result, 'table' => $Page['table']);
}
}
?>
PHP代码:
$list = Custom_Page::mToPage($dbAdapter->fatchPage('SELECT * FROM user JOIN type on (user.typeid=type.id)', 10, $this->_getParam('page')));$this->view->showPage = $list['showpage'];
$this->view->table = $list['table'];
PHP代码:
<?php
require_once 'Zend/Db.php';
require_once 'Custom\Db\Adapter\Pdo\Mysql.php';
class Custom_Db extends Zend_Db
{
public static function myfactory($config = array())
{
$adapterName = 'Custom_Db_Adapter_Pdo_Mysql';
$dbAdapter = new $adapterName($config);
return $dbAdapter;
}
}
?>
PHP代码:
$dbAdapter = Custom_Db::myfactory($config->db->config->toArray());Custom_Db_Table::setDefaultAdapter($dbAdapter);
$dbAdapter->query('SET NAMES UTF8');
Zend_Registry::set('dbAdapter', $dbAdapter);
PHP代码:
<{section name=key loop=$table}><{$table[key].name}><br>
<{/section}>
<{$showPage}>
[ 本帖最后由 wz_910 于 2008-8-19 14:35 编辑 ]
作者: wz_910 发布时间: 2008-08-01
作者: wz_910 发布时间: 2008-08-01
引用:
原帖由 wz_910 于 2008-8-1 14:06 发表难道又是“曲高和寡”?
http://framework.zend.com/manual/en/zend.paginator.html
作者: jasonqi 发布时间: 2008-08-01
作者: wz_910 发布时间: 2008-08-01
引用:
原帖由 wz_910 于 2008-8-1 14:42 发表代码包里没有啊,那就送给那些,图省事的朋友吧。
作者: jasonqi 发布时间: 2008-08-01
SHOW一下我的CRUD界面,基本的功能有增加,删除,更新,查询,分页,排序,刷新,校验,装饰和过滤。并且能很灵活配置和扩展。基本上我都是拿别人的轮子自己组装的。使用ZF封装了三个jquery的插件,flexigrid,thickbox,和ajaxform,直接在php脚本中就可以对这些插件的参数进行配置。
呵呵,封装之后,从数据表设计到生成CRUD页面只需要10分钟,甚至更少。
下面的是调用的页面,以tbl_test为例。建好数据表,注释好字段(注释之后就不用翻译字段名了)
在M层定义一个Form模型和Table模型,基本上空的就可以了。一共要写6行代码
PHP代码:
//Form_Test模型class Form_Test extends Itc_Form
{
}
//Tbl_Test模型
class Tbl_Test extends Itc_DB_Table
{
}
PHP代码:
public function testAction(){
//创建数据库对象
$tbl = new Tbl_Test();
//获得提交的类型
$type = $this->_getType();
if('GRID' == $type){ //如果是grid的提交,则让数据库对象处理提交内容,然后返回json数据
$this->_helper->json($tbl->ajaxQuery($this->_request));
}
else{
//创建一个表单对象
$form = new Form_Test();
//将表单关联数据对象
$form->setTable($tbl);
//将数据库字段转换成表单元素,构造表单的html代码,并设置校验器,过滤器和装饰器。
$form->setTableElements();
//设置form的action为当前action
$form->setAction($this->view->url());
if ('POST' == $type){ //如果是表单提交
//获得表单值
$formData = $this->_request->getPost();
//校验
if ($form->isValid($formData)){
try{
//保存,如果是新增就插入,否则就是update,自动判断
$tbl->save($formData);
}
catch (Exception $e){
//报错
$message = $this->_('Error: Data can not be saved');
$this->_helper->json(array('error'=>$e->getMessage()));
exit;
}
//返回表单提交成功消息
$this->_helper->json(true);
}
else{
//返回校验失败信息
$this->_helper->json($form->getMessages());
}
}
else{
//创建一个grid对象
$grid = new Itc_Grid();
//设置标题
$gridOptions['title'] = '用户一览';
//设置检索的字段
$gridOptions['searchitems'] = array('code','name','rate');
$grid->setOptions($gridOptions);
//将数据对象关联Grid对象,目的为了获得字段的注释内容
$grid->setTable($tbl);
//将grid对象和form对象交给view去处理
$this->view->grid = $grid;
$this->view->form = $form;
}
}
}
PHP代码:
//输出grid<?=$this->grid?>
//设置thickbox的title和长宽
<?=$this->thickbox('用户信息',300,220)?>
//设置ajax form
<?=$this->ajaxForm($this->form)?>
显示效果如下:
表单列表界面
表单输入的界面
作者: sentrychen 发布时间: 2008-08-01
作者: fleaphp 发布时间: 2008-08-01
作者: sentrychen 发布时间: 2008-08-01
作者: 七月十五 发布时间: 2008-08-01
不过你的代码有个严重的安全漏洞:
$tbl->save($formData);
作者: fleaphp 发布时间: 2008-08-01
但我看不出$tbl->save($formData)有啥安全问题,请指教。。。
附上save的代码
PHP代码:
public function save(array $data){
$primary = (array) $this->_primary;
$pkData = array_intersect_key($data, array_flip($primary));
$where = array();
$data = array_intersect_key($data, array_flip($this->_cols));
foreach ($primary as $key)
{
if (!isset($pkData[$key]) || '' === $pkData[$key])
{
return $this->insert($data);
}
$where[] = $this->_db->quoteInto($key . ' = ?', $pkData[$key]);
}
return $this->update($data, $where);
}
作者: sentrychen 发布时间: 2008-08-01
你先前添加了一个记录,其 id 是 456-AAA。
现在我准备添加记录,但是我伪造了一个表单,提交了一个包含主键 ID 的字段,其值为 456-AAA。
很显然,由于 save() 方法根据自动判断是否有主键来更新记录。最终就是我更新了你添加的记录。
作者: fleaphp 发布时间: 2008-08-01
引用:
原帖由 sentrychen 于 2008-8-1 17:18 发表C层比较多一些代码。不过基本上都可以复制粘贴的。其实还可以进一步封装,但为了方便细节控制就没有做了。
作者: jasonqi 发布时间: 2008-08-02
引用:
原帖由 fleaphp 于 2008-8-1 23:54 发表假设我的用户 id 是 123,你的用户 ID 是 456。
你先前添加了一个记录,其 id 是 456-AAA。
现在我准备添加记录,但是我伪造了一个表单,提交了一个包含主键 ID 的字段,其值为 456-AAA。
很显然,由于 save( ...
呵呵,还是谢谢你提出这个问题。其实你说的这个问题,我在使用你的fleaphp将里面的shop范例改成多用户多shop的时候就碰到了,不过只要考虑到了,就很好解决的。
作者: sentrychen 发布时间: 2008-08-02
1) 在Url 添加一个参数对,传递表信息,其实就是表的名称,如 /tb/role,这样对应于CRUD的Urls就出来了,例如:
/dbform/edit/tb/role/id/4,其中 dbform是控制器,edit是动作, 表名是 role, id = 4。在控制器里,做4个对应的动作方法。
2)在模型里,处理关于表的细节,例如字段标题,我使用 MySQL ,表里没有这些信息,我就手工在模型里做个数组(缺点是,修改表结构的时候,一定要记住在这里做相应的修改)
这是我的demo,你可以看一下
http://dev.tmclubs.org/
其中,role和club管理是用上述方法做的,其它还是老方法(我主要是想对比一下)
作者: jasonqi 发布时间: 2008-08-03
[ 本帖最后由 wz_910 于 2008-8-4 09:48 编辑 ]
作者: wz_910 发布时间: 2008-08-04
作者: peacock 发布时间: 2008-08-04
作者: liumingl 发布时间: 2008-08-04
相当费劲!!
[ 本帖最后由 hmly 于 2008-8-4 16:53 编辑 ]
作者: hmly 发布时间: 2008-08-04
[ 本帖最后由 lei0535 于 2008-8-4 17:20 编辑 ]
作者: lei0535 发布时间: 2008-08-04
zf的分页算法我也没有看过。但个人觉得楼主的分页算法还算不上曲高吧。
提几点个人的意见:
1,分页算法至少要能自动获取和解析分页参数值,比如page的值,query的值,然后根据这些值去获取分页内容。这个应该是分页类最基本的工作。
2,扩展Zend_Db和Zend_Db_Table是很好的,但如果只是为了分页而去扩展实在没有必要。你对Zend_Db_Adapter_Pdo_Mysql的扩展让我很惊讶,这样做的目的是什么呢?是为了说明这个分页类只能适用mysql数据库?说实话利用Zend_Db中的query方法能做得更好,还可以兼容各种数据库。
3,
PHP代码:
$result['count'] = $this->fetchAll($where, $order)->count();$result['table'] = $this->fetchAll($where, $order, $pagesize, $offset)->toArray();
作者: sentrychen 发布时间: 2008-08-05
作者: wz_910 发布时间: 2008-08-05
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28