Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1416110
  • 博文数量: 264
  • 博客积分: 5810
  • 博客等级: 大校
  • 技术积分: 3528
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 17:15
文章分类

全部博文(264)

文章存档

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'] =  '

'.$error.'

';

            $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  .$data['rootUrl'].'article/'.$id.'">here to view the published post.

';

            $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'] =  '

'.$error.'

';

            $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  .$data['rootUrl'].'article/'.$p->id.'">here to view the post.

';

            $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 $pid is deleted successfully!

";

            $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. 编写一个接口提供JSONXML的数据输出

这个示例的作用就是解决通过URL配置可以输出JSON的数据接口

好像跟我的URL没啥大的关联起来哦!

 

示例07. 处理这种具有多个表关联查询的情况.有多个表关联的时候如何解决依赖查询与更新的依赖关系

如何在ORM层实现多个表的关联查询操作

实例暂留空吧~~~~

阅读(4450) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

leaderddd2014-05-07 17:26:51

挺好,我也正在学,有好多问题,可以加qq 研究一下吗,314620891