codeigniter和mvc续

系统 1484 0

 

codeigniter 的程序流程

1.        设计视图

首先,让我们设计视图并把它保存到如下路径: system/application/views/testview.php

  1. <html>  
  2. <head>  
  3.   < !DOCTYPE  html PUBLIC   "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
  4.   <html xmlns= "http:////www.w3.org/1999/xhtml" >  
  5.   <title>Web test Site</title>   
  6. </head>  
  7. <body>  
  8.   <h1><?php  echo   $mytitle ; ?> </h1>  
  9.   <p  class = "test" > <?php  echo   $mytext ; ?> </p>  
  10. </body>  
  11. </html>  
   代码片段1 视图demo

       

        你还可以联想到,变量 $mytitle $mytext 的内容呢?答案是我们需要一个新的控制器!

 

2.         设计控制器

现在,我们需要一个新的控制器。我们将其命名为 Start 并保存在: /system/application/controllers/start.php

该控制器必须做几件事:

·          调用视图

·          把一些数据传递给视图:它正在期待标题( $mytitle )和一些本文( $mytext

·          最后,我们想要控制器接受来自使用者的一个参数(例如通过 URL 请求)

      
  1. <?php
  2. class  Start  extends  CI_Controller {
  3. function  __construct()
  4. {
  5.       parent::__construct();
  6. }
      
        
          代码片段2 控制器构造函数
        
      
    

        在上面的代码中可以看出 Start 是一个构造函数,他完成了控制器的初始化。

       下面是将参数传递个一个函数的代码:

  1. function  hello( $name )  
  2. {  
  3.      $data [ 'mytitle' ] =  'Welcome to this site' ;  
  4.      $data [ 'mytext' ] =  "Hello, $name, now we're getting dynamic!" ;  
  5.      $this ->load->view( 'testview' $data );  
  6. }  
  7. ?>  
  代码片段3 控制器url映射函数


     这个函数期待一个参数, $name ,可能会产生疑问 $name 变量从哪来?其实它需要来自 URL 请求的第三个参数,话句话说换句话说,当你输入 URL

http://www.mysite.com/index.php/start/hello/fred

URL 的最后一段作为一个参数传给函数 hello ,倒数第二个参数是指当前的函数名是 hello ,倒数第三个函数是指当前的控制器名字是 start 。当然我们还会看到 index.php 这个参数,这是由于 CI 将所有的请求都发送到了 index.php 文件中,你也可以用 .htaccess 文件重写 URL 来去掉 index.php ,考虑到服务器可能不支持 .htaccess ,我们没有做出修改。

     再回到对控制器的讨论中,注意 hello() 函数如何先设置一个名为 $data 的数组,并把一些对象的属性及文本读入数组。然后它通过名称装载视图,并把刚生成的 $data 数组作为第二个参数。在幕后, CI 很好地利用了另外一个 PHP 函数: extract() ,这个函数的作用是把数组中的元素取出放入变量表,其中每个键值对中的键名即为变量名,对应该键名的值为变量的值。因此我们刚才定义的 $data 数组在视图中转换成一个单一的变量: $text (等于 “Hello, $name, now we're getting dynamic” )。

     换句话说,当它被建立的时候, $data 数组看起来像这样:

     Array

  [mytitle] => 'Welcome to this site',

  [mytext] => "Hello, fred, now we're getting dynamic!"

) ;

     但是当它被传递给视图的过程中,它被解开,并且下列变量在视图对象中生成,与 $data 的每个键 / 值相对应:      

     $mytitle    =   'Welcome to this site';

     $mytext    =   "Hello, fred, now we're getting dynamic!";

     虽然你只传送一个变量到视图中,但是,你能把许多数据装进那个变量中。 $data 数组的每个值还可以是数组,这被称为多维数组,因此,用一个数组变量可以把大量的变量传递给视图。

 

     3. 设计模型

        其实模型的设计要在控制器之前完成的,但是为了演示控制器和视图之间的数据流动,我们把控制器和视图放到一起说了。

        所以说上面介绍的只是 VC ,因为还没介绍到 M ,也就是模型。下面构造一个MVC的完整流程。

        在第二部分介绍控制器时给数组 $data 的元素赋值时,我们用到的都是常量,其实在实际的编码情况中,我们的数据都是从数据库中读出的,这份工作就是下面要说到的控制器的职责。先看下面一部分代码:      

  1. <?php  
  2.       class  Art  extends  CI_Model {  
  3.              public   function  __construct() {  
  4.                    parent::__construct();  
  5.                     //$this->load->library('database');//在autoload.php中配置了自动加载database类   
  6.             }  
  7.              public   function  getList( $name ) {  
  8.                     $this ->db->select( 'title,content' ); 
  9.    if (!is_null( $name )) { 
  10.                     $this ->db->where( 'author' $name );  
  11.    }
  12.                     $result = $this ->db->get( 'art' );  
  13.                     return   $result ->num_rows()>0 ?  $result ->result_array() : null;  
  14.             }  
  15.   
  16.   
  17.      }  
  18. ?>  
代码片段4 模型demo

 

       首先我们看到这也是一个类,继承自父类 Model ,首先由 __construct 函数完成该类的初始化。并加载了 CI 的数据库类 ( 也就是我们前面所有的 AR) 。然后我们看类中的 getOne 函数,这是要介绍的重点。

      $this->db->select(‘title,content’);

      $this->db->where(‘ author ’,$name);

      $result=$this->db->get(‘art’);

这三句话放到普通的 php 中应该是这么写的:

$sql =”select title,content from art where author =’“.$name.”’”;

$result =mysql_query($sql);  

 

可以看出用了 AR 后数据库的处理变得简洁明了,并且更重要的是 CI AR 生成隐含的代码,在幕后进行转意和类型转化,使代码更加健壮。

       我们在模型中将数据进行处理(查询、修改、删除等),然后将处理结果交给控制器处理。控制器在这里起到了路由的作用,它会将处理的结果交给不同的视图去处理。

在控制器中我们这么取出数据:

      

  1. <?php  
  2. class  Artmanager  extends  CI_Controller {  
  3.      function  __construct() {  
  4.         parent::__construct();  
  5.          $this ->load->model( 'art' );  
  6.     }  
  7.   
  8.      function  index( $authName ) { 
  9. //$this->load->library('unit_test');  
  10.          $list  =  $this ->art->getList( $authName );  
  11.          $data [ 'list' ] =  $list ;  
  12.          $this ->load->view( 'art_list' , $data ); 
  13. //$this->output->enable_profiler(TRUE); 
  14.     }  
  15. }  
代码片段5 控制器中使用模型

        注意以下两句是整段代码的重点,这两句扼要的指出了在控制器中怎样使用模型。 
       
  1. $this ->load->model( 'art' );               
  2. $list  =  $this ->art->getList( $authName );  
  1. 最后一句使用来加载视图的:      
  1.     $this ->load->view( 'art_list' , $data );     
  1. 使用这一句将 $data 数组中的数据传递到art_list.php(文件存放位置稍后给出)这个文件中。现在看一下art_list.php文件到底怎样操作来展现这个视图的内容:  
  1. <!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Transitional//EN"   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >  
  2. <html xmlns= "http://www.w3.org/1999/xhtml" >  
  3. <head>  
  4.     <meta http-equiv= "Content-Type"  content= "text/html; charset=utf-8"  />  
  5.     <title>文章列表</title>  
  6.     <base href="<?php echo base_url();?>" />
  7.     <meta name= "keywords"  content= ""  />  
  8.     <meta name= "description"  content= ""  />  
  9.     <link href="css/index.css" rel="stylesheet" type="text/css" />
  10. </head>  
  11.   
  12. <body>  
  13.     <table  class = "list" >  
  14.         <tr>  
  15.             <th></th><th>标题</th><th>内容</th>  
  16.         </tr>  
  17.   
  18.     <?php  
  19.          if  ( is_null ( $list )) {  
  20.     ?>  
  21.         <tr><td colspan= "3" >没有数据</td></tr>  
  22.     <?php  
  23.         }  else  {  
  24.              foreach  ( $list   as   $index => $article ) {  
  25.     ?>  
  26.                 <tr>  
  27.                     <td><?php  echo   $index +1;?></td>  
  28.                     <td><?php  echo   $article [ 'title' ]?></td>  
  29.                     <td><?php  echo   $article [ 'content' ]?></td>  
  30.                 </tr>  
  31.     <?php  
  32.             }  
  33.         }  
  34.     ?>  
  35.   
  36.     </table>  
  37. </body>  
  38. </html>  

代码片段6 视图中解析控制器中的参数
    注意代码片段6中的:  
  1. foreach  ( $list   as   $index => $article )  
        这一句,如果你没有记错的话,从控制器里传递过来的参数$data是一个数组,但是这里面的变量$list看上去像是没有定义过的。恭喜你,猜的没错了,CI内部就是调用了extract这个函数将$data数组中的元素拆分到以键名为变量名的变量中去了,所以你在这里可以直接使用$list这个变量。
       最后看一下成果,在浏览器里直接输入 http://localhost/ci/index.php/artmanager/index/admin  这个地址,会显示查询的表格数据:
        codeigniter和mvc续
4.备注

为了让上述代码能够正确的运行起来,还需要做一些响应的配置。首先,在application/config/database.php中配置数据库连接:

 

      $db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '';
$db['default']['database'] = 'mycms';
    

 然后在application/config/autoload.php中定义自动加载的类库,修改一下里面的相应代码就可以了:

 

      /*
| -------------------------------------------------------------------
|  Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in the system/libraries folder
| or in your application/libraries folder.
|
| Prototype:
|
|	$autoload['libraries'] = array('database', 'session', 'xmlrpc');
*/

$autoload['libraries'] = array('database', 'session');


/*
| -------------------------------------------------------------------
|  Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
|	$autoload['helper'] = array('url', 'file');
*/

$autoload['helper'] = array('url');
    
 

  虽然这篇教程中没有用到session,但是按照我的惯例,我还是把他配置上了。如果你在运行的时候,出现了如下提示:

 

An Error Was Encountered

In order to use the Session class you are required to set an encryption key in your config file.

那么修改一下 application/config/autoload.php中的 encryption_key元素即可,随便输入几个字符:

 

      /*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class or the Session class you
| MUST set an encryption key.  See the user guide for info.
|
*/
$config['encryption_key'] = 'FSJFEO@¥#%)#(¥02334';
    
 

注:以上内容改编自《codeigniter敏捷开发框架》中的部分内容。详细代码以及数据库文件,见附件。

本教程基于ci2.x编写,基于1.x的教程可参见我的csdn博客 http://blog.csdn.net/yunnysunny/article/details/6214171

 

codeigniter和mvc续


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论