2011年(264)
分类: 系统运维
2011-04-13 21:18:15
实战doophp(代码篇)
示例01. 对一个表进行查询分页显示输出到table里面去
控制器代码
class AdminController extends DooController { //Default sort by createtime field public $sortField = 'id'; public $orderType = 'desc'; //测试URL路由 public function index() { Doo::loadHelper("DooPager"); Doo::loadModel("User"); $p = new User(); if($this->sortField == 'id' && $this->orderType == 'desc') { $pager = new DooPager(Doo::conf()->APP_URL.'index.php/simple',$p->count(),1,100); } if(isset($this->params['pindex'])) { $pager->paginate(intval($this->params['pindex'])); } else { $pager->paginate(1); } $data['rootUrl'] = Doo::conf()->APP_URL; $data['pager'] = $pager->output; if ($this->orderType == 'desc') { $data['posts'] = $p->limit($pager->limit,null,$this->sortField,array('select'=>'id,username'));//其实效果跟find差不多的 } $data['order'] = 'asc'; $this->render('admin',$data); } public function page() { if(isset($this->params['pindex']) && $this->params['pindex']>0) $this->index(); else return 404; } } |
几点说明:
1. 分页的时候
$pager = new DooPager(Doo::conf()->APP_URL.'index.php/simple',$p->count(),1,100);
其中$p->count() 表示当前数据集的总个数有多少。1表示的limit分页的时候每一页显示多少条记录,100表示那个分页条最多可以显示多少个标签段
2. 调用数据集查询的方法
$data['posts'] = $p->limit($pager->limit,null,$this->sortField,array('select'=>'id,username'));
为什么要单独写一个page()方法呢?
解释:因为下一页的时候会有一个新的URL跳转。而这个在URLS里面进行配置了这个与CI的实现不一样。CI中可以直接截取后面这个数字。所以分页在使用doophp的时候得写两个Action进来
路由配置
$route['*']['/simple'] = array('AdminController', 'index');
$route['*']['/simple/:pindex'] = array('AdminController', 'page');
视图层代码
<div id="content">
<div class="left">
<div class="articles">
<table>
<tbody><tr>
<th width="150"><a href="{{rootUrl}}admin/post/sort/status/{{order}}">ida>th>
<th width="500"><a href="{{rootUrl}}admin/post/sort/title/{{order}}">usernamea>th>
tr>
<tr class="trecord">
<td>{{posts' value.@id}}{{posts' value.@id}}td>
<td><a href="{{rootUrl}}admin/post/edit/{{posts' value.@id}}">{{posts' value.@username}}a>td>
tr>
tbody>table>
div>
<hr class="divider"/>
{{pager}}
div>
<div class="right">
div>
<div style="clear: both;"> div>
div>
几点说明:
1、 HTML里面实现模板的逻辑判断
2、 实现遍历操作
<tr class="trecord">
<td>{{posts' value.@id}}{{posts' value.@id}}td>
<td><a href="{{rootUrl}}admin/post/edit/{{posts' value.@id}}">{{posts' value.@username}}a>td>
tr>
3、 引入其他的静态资源文件
应用说明:可以实现对一些列表集数据的查看。
示例02. 添加一个新用户
打开添加新用户的视图.引出了一个新东西就是这个框架本身的一个验证框架。跟CI的使用非常类似可以实现验证功能。呆会体验一下这个验证框架的魅力吧.这一块好像没有官方的文档自己呆会好好整理整理一下这块的要求~~
控制器这块的代码
public function createPost() {
$data['rootUrl'] = Doo::conf()->APP_URL;
$this->render('admin_new_post', $data);
}
映射到添加视图上去!
public function saveNewPost() {
Doo::loadHelper('DooValidator'); //表单验证帮助库
$_POST['username'] = trim($_POST['username']);
$_POST['id'] = trim($_POST['id']);
$validator = new DooValidator;
$validator->checkMode = DooValidator::CHECK_SKIP;
if($error = $validator->validate($_POST,'post_create.rules')) {
$data['rootUrl'] = Doo::conf()->APP_URL;
$data['title'] = 'Error Occured!';
$data['content'] = ' '
$data['content'] .= ' Go back to
edit.
$this->render('admin_msg', $data);
//使用了doophp自带的验证框架可以在里面填写相应的验证规则。
} else {
Doo::loadModel("User");
$p = new User($_POST);//操作非常类似于django的操作了将post过来的数据封装到这个模型类即可。
$id = $p->insert();//直接调用这个insert函数即可
$data['rootUrl'] = Doo::conf()->APP_URL;
$data['title'] = 'Post Created!';
$data['content'] = ' Your post is created successfully!
$data['content'] .= ' Click
.
$this->render('admin_msg', $data);
}
}
相应的验证方法写到config目录下面的forms目录下面。比如我的验证方法是这样写的
return array(
'username' => array(
array( 'maxlength', 145, 'Title cannot be longer than the 145 characters.' ),
array( 'notnull' ),
array( 'notEmpty', 'Title cannot be empty.' ),
),
'id' => array(
array( 'integer', 'Invalid status for blog post' ),
array( 'max', 10000, 'Invalid status for blog post' ),
array( 'min', 0, 'Invalid status for blog post' ),
)
);
这里面就可以对相应的ORM里面的字段的输入进行一次验证处理.
验证通过了之后就可以进行正常保存了。
路由器这块的配置
$route['*']['/simple/post/create'] = array('AdminController', 'createPost');//点击是可以弹出添加的窗口页面的URL配置
$route['post']['/simple/post/saveNew'] = array('AdminController','saveNewPost');
注意:这里面是进行了一次post操作所以这里面的方法是post形式过去的!
相应的视图代码
<div id="content">
<div class="left">
<p><strong>Editing Poststrong>p>
<form method="POST" action="{{rootUrl}}index.php/simple/post/saveNew">
<span class="field">
<strong>username: strong><br/>
<input type="text" size="60" name="username"/>
span>
<span class="field">
<strong>id: strong><br/>
<input type="text" size="60" name="id"/>
span>
<span class="field">
<strong> strong>
<input type="submit" value="Create This Post" style="width:300px;"/>
span>
form>
div>
div>
相关QA1. 验证的规则要怎么写?
示例03. 修改一个用户信息
点击某一个用户的时候显示其相应的编辑窗口
这个用户的独立信息内容提取方式如下
public function editPost() {
$id = $this->params['pid'];//得到其相应的ID值
Doo::loadModel("User");
$p = new User();
$p->id = intval($id);
try {
$data['user'] = $this->db()->find( $p, array('limit'=>1) );//获取到其相应的数据集内容
} catch(Exception $e){
return array('/error/postNotFound/'.$p->id,'internal');
}
$data['rootUrl'] = Doo::conf()->APP_URL;
$this->render('admin_edit_post', $data);
}
相应的编辑视图代码
<div class="left">
<p><strong>Editing Poststrong>p>
<form method="POST" action="{{rootUrl}}index.php/simple/post/save">
<span class="field">
<strong>id: strong><br/>
<input type="text" value="{{user.@id}}" size="60" name="id"/>
span>
<span class="field">
<strong>username: strong><br/>
<input type="text" value="{{user.@username}}" size="60" name="username"/>
span>
<span class="field">
<strong> strong>
<input type="submit" value="Update post" style="width:240px;"/>
span>
form>
div>
相应的得到其对象的值。
再看保存的Action
public function saveEditPost() {
Doo::loadHelper("DooValidator");
$_POST['username'] = trim($_POST['username']);
$validator = new DooValidator;
$validator->checkMode = DooValidator::CHECK_SKIP;
if($error = $validator->validate($_POST,'post_edit.rules')){
$data['rootUrl'] = Doo::conf()->APP_URL;
$data['title'] = 'Error Occured!';
$data['content'] = ' '
$data['content'] .= ' Go back to
edit.
$this->render('admin_msg', $data);
} else {
Doo::loadModel('User');
$p = new User($_POST);
$p->update();
$data['rootUrl'] = Doo::conf()->APP_URL;
$data['title'] = 'Post Updated!';
$data['content'] = ' Your changes is saved successfully.
$data['content'] .= ' Click
.
$this->render('admin_msg', $data);
}
}
其相应的路由配置
$route['*']['/simple/edit/:pid'] = array('AdminController','editPost','match'=> array('pid'=>'/^\d+$/'));
$route['post']['/simple/post/save'] = array('AdminController','saveEditPost');
示例04. 通过ajax的方式删除一个用户
不用ajax的方式了直接将一个用户信息删除的方式如下
控制器代码如下
public function delPost() {
$pid = intval($this->params["pid"]);
if($pid > 0) {
Doo::loadModel('User');
$user = new User;
$user->id = $pid;
$user->delete();
$data['rootUrl'] = Doo::conf()->APP_URL;
$data['title'] = 'Post Deleted!';
$data['content'] = " Post with ID
$this->render('admin_msg', $data);
}
}
路由配置
$route['*']['/simple/del/:pid'] = array('AdminController','delPost','match'=> array('pid'=>'/^\d+$/'));
说明:请用Django的思想来思考这个框架你会发现原来有这么多的相似之处呀!
示例05. 解析JSON数据并生成分页显示
控制器代码
public function home() {
$var = '[{"Name":"Peter","Age":20},{"Name":"ls","Age":21},{"Name":"ww","Age":25}]';
$jsondecode = json_decode($var);//
$data["user"] = $jsondecode;
$this->render('index',$data);
}
注意:JSON的格式组成样式哦~~
视图层代码
<table>
<tbody><tr>
<th width="150">nameth>
<th width="500">ageth>
tr>
<tr class="trecord">
<td>{{user' value.@Name}}td>
<td>{{user' value.@Age}}td>
tr>
tbody>table>
json_decode : 将JSON字符串解码成相应的JSON数据结构来使用了!到了JSON对象之后就可以直接使用JSON里面的对象数据
示例06. 编写一个接口提供JSON与XML的数据输出
这个示例的作用就是解决通过URL配置可以输出JSON的数据接口
好像跟我的URL没啥大的关联起来哦!
示例07. 处理这种具有多个表关联查询的情况.有多个表关联的时候如何解决依赖查询与更新的依赖关系
如何在ORM层实现多个表的关联查询操作
实例暂留空吧~~~~